IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Erreur 1064 mais fonctionne avec phpMyAdmin [PDO]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Par défaut Erreur 1064 mais fonctionne avec phpMyAdmin
    Bonsoir,

    J'ai un gros souci avec cet chaine SQL :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT ref_agrement, pharmacien.id, pharmacien.nom, pharmacien.prenom,
     officine.adresse, officine.pays, officine.ref_code_postal, SUBSTR(date_debut, 1, 4) 
    FROM pharmacien
    LEFT JOIN agrement ON pharmacien.ref_agrement = agrement.id 
    LEFT JOIN officine ON pharmacien.ref_identification = officine.ref_identification WHERE officine.pays = 1 
    AND officine.ref_code_postal BETWEEN 1 AND 504 
    ORDER BY pharmacien.nom

    J'obtiens cette erreur :

    Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ORDER BY pharmacien.nom' at line 1' in /home/web998/public_html/filtre.php:98 Stack trace: #0 /home/web998/public_html/filtre.php(98): PDOStatement->execute(Array) #1 {main} thrown in /home/web998/public_html/filtre.php on line 98
    Le plus dingue, c'est que quand je copie la chaine sql dans phpmyadmin, elle fonctionne parfaitement.

    Le code PHP est assez compliqué (création de requêtes dynamiques), je mets donc le code SQL pour le moment.

    Voyez-vous une erreur dans cette chaine ?

    Merci d'avance.

    bee

  2. #2
    Rédacteur

    Homme Profil pro
    Geek entrepreneur
    Inscrit en
    Novembre 2004
    Messages
    1 224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Geek entrepreneur

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 224
    Par défaut
    si la chaine SQL passe sous phpmyadmin c'est peut être le formattage produit par ton code PHP qui pose problème non ?
    Par exemple un espace qui manque sur un retour à la ligne ?

  3. #3
    Membre expérimenté
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Par défaut
    Salut,

    Merci pour ta réponse.

    Voici le code de la chaine sql façon "pdo" :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ref_agrement, pharmacien.id, pharmacien.nom, pharmacien.prenom, officine.adresse, officine.pays, officine.ref_code_postal, SUBSTR(date_debut, 1, 4) FROM pharmacien LEFT JOIN agrement ON pharmacien.ref_agrement = agrement.id LEFT JOIN officine ON pharmacien.ref_identification = officine.ref_identification WHERE officine.pays = :param1 AND officine.ref_code_postal BETWEEN :param2 ORDER BY pharmacien.nom

    Voici mon code (assez compliqué) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    <?php
       error_reporting(E_ALL);  
     
       try  {
     
                // connexion
                $conn = new PDO('mysql:host=127.0.0.1;dbname=stageoff','stageoff','mdp');
     
                $conn->exec('SET NAMES utf8');
     
                // les attributs ATTR_ERRMODE et ERRMODE_EXCEPTION permettent de provoquer 
                // des messages d'erreurs lorsqu'il y a un problème de requête SQL
                $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
     
            } catch (Exception $e) {
     
                // affiche les éventuels messages d'erreurs relatifs à la connexion
                die(print_r('Erreur : ' . $e->getMessage()));
     
            }
     
       //tableau destiné à recevoir les différentes conditions de recherche
    	$conditions = array();
     
    	//transforme le json en tableau associatif (true indique que l'on veut un tableau associatif)
    	$ligne = json_decode($_POST['to_send'],true);
     
       //parcours de mon tableau associatif nomme $ligne
    	foreach($ligne as $field => $value)
       {		
    		if(trim($value) != '')
    		{
             if($field == 'officine.adresse')
             {
                //'%'.$value.'%' permet de sélectionner une partie de l'adresse n'importe où dans la chaine (pas seulement au début)
                $conditions[] = array($field, 'LIKE', '%'.$value.'%');
             }
             elseif($field == "officine.ref_code_postal")
             {
                $min_max = explode('-',$value);
                $conditions[] = array($field, 'BETWEEN', $min_max[0].' AND '.$min_max[1]);
             }
             elseif($field == "officine.pays")
             {
                $conditions[] = array($field, '=', $value);
             }
    			else
             {
                $conditions[] = array($field, 'LIKE', $value);
             }
    		}
    	}
     
       // Préparation de la chaîne SQL pour pouvoir utiliser une requête préparée avec des conditions dynamiques
    	$chaine = 'SELECT ref_agrement, pharmacien.id, pharmacien.nom, pharmacien.prenom, officine.adresse, officine.pays, officine.ref_code_postal, SUBSTR(date_debut, 1, 4) ';
       $chaine.= 'FROM pharmacien ';
       $chaine.= 'LEFT JOIN agrement ON pharmacien.ref_agrement = agrement.id ';
       $chaine.= 'LEFT JOIN officine ON pharmacien.ref_identification = officine.ref_identification ';
       $chaine.= 'WHERE';
     
    	for ($i = 0; $i < sizeof($conditions); $i++)
    	{
    		$chaine .= " ".$conditions[$i][0]." ".$conditions[$i][1]." :param".($i + 1);
    		if ($i < sizeof($conditions) - 1)
    		{
    			$chaine .= " AND";
    		}
    	}
    	$chaine .= " ORDER BY pharmacien.nom";
       echo $chaine.'<br />';
    	$req = $conn->prepare($chaine);
     
    	// On lie les conditions à la requête
    	$params = array();
    	for ($i = 0; $i < sizeof($conditions); $i++)
    	{
    		if ($conditions[$i][1] == '=')
    		{
    			$condition = $conditions[$i][2];
    			$params[':param'.($i + 1)] = $condition;
    		}
    		elseif($conditions[$i][1]=='BETWEEN')
    		{
    			$condition = $conditions[$i][2];
    			//$req->bindParam(($i + 1), $condition, PDO::PARAM_STR);
    			$params[':param'.($i + 1)] = $condition;
    		}
          else
          {
             $condition = $conditions[$i][2].'%';
    			//$req->bindParam(($i + 1), $condition, PDO::PARAM_STR);
    			$params[':param'.($i + 1)] = $condition;
          }
    	}
     
    	// execution de la requête
       echo str_replace(array_keys($params), array_values($params), $req->queryString);
    	$req->execute($params);
    	//echo str_replace(array_keys($params), array_values($params), $req->queryString);
     
    	//Récupération du nombre d'enregistrements retournés par la requête précédente
    	$reqnb = $req->fetchAll();
    	$nbre_resultats = count($reqnb);
     
       // On rexecute la requête car on a déjà parcouru tous les résultats pour les compter et que l'on ne peut pas repositionner le curseur au début pour les reparcourir
    	$req->execute();
     
       // Sinon, on affiche les différents résultats
    	$retour = '<table border="2" style="border-color:blue;border-style:solid;">'; 
    	$retour.= '<tr><td>Nom</td><td>Pr&eacutenom</td><td>Gender</td><td>Date of birth</td><td>Date of death<td>DMU</td><td>Date of last visit</td></tr>';
     
    	// IMPORTANT : ne pas oublier le conditionètre PDO::FETCH_ASSOC ici, sinon PDO retourne par défaut un tableau de résultats mixte
    	// c-à-d qu'on peut accéder aux résultat par leur index ou par le nom du champ => résultats en double lorsque que l'on parcours tous les résultats à l'aide de foreach
    	while ($row = $req->fetch(PDO::FETCH_ASSOC))
    	{
    		//$retour.= '<tr><td align="center"><input type="button" value="" id="'.$row["nom"].'" /> </td>';
    		foreach($row as $NomCol => $Valeur)
    		{	//je n'affiche que les colonnes nécessaires
    			//1 je parts d'ici, je vais dans la fonction update_enregistrement
    			if($NomCol != 'ref_agrement' && $NomCol != 'id')
             {
                $retour.= '<td><input type="text" name="new[' . $row['id'] . '][' . $NomCol . ']" id="new[' . $row['id'] . '][' . $NomCol . ']" value="'.$Valeur.'"/></td>';   
             }         
             //echo $NomCol.''.$valeur;		
          }
    		$retour.= '</tr>';
    	}
    	$retour.='</table>';
    	echo $retour;
    ?>
    Merci d'avance pour votre aide, parce que je suis bloqué depuis plusieurs heures.

    bee

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Que vaut $chaine ? $conditions ? $params ?
    Il faut debuguer un peu
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre éclairé

    Femme Profil pro
    Experte JS / Conseillère en best practices / Chercheuse en programmation
    Inscrit en
    Octobre 2007
    Messages
    741
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Experte JS / Conseillère en best practices / Chercheuse en programmation
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 741
    Par défaut
    1. Vérifie ta PDOStatement->$queryString, pour voir si tout correspond.
    2. Nomme tes paramètres, tu y verras plus clair, ça évite souvent de bêtes erreurs...

  6. #6
    Membre expérimenté
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Que vaut $chaine ? $conditions ? $params ?
    Il faut debuguer un peu
    Salut,

    Merci pour ta réponse.

    Je ne fait que débugger depuis plusieurs heures :

    Chaine vaut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ref_agrement, pharmacien.id, pharmacien.nom, pharmacien.prenom, officine.adresse, officine.pays, officine.ref_code_postal, SUBSTR(date_debut, 1, 4) FROM pharmacien LEFT JOIN agrement ON pharmacien.ref_agrement = agrement.id LEFT JOIN officine ON pharmacien.ref_identification = officine.ref_identification WHERE officine.pays = :param1 AND officine.ref_code_postal BETWEEN :param2 ORDER BY pharmacien.nom
    Conditions vaut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Array ( [0] => Array ( [0] => officine.pays [1] => = [2] => 1 ) [1] => Array ( [0] => officine.ref_code_postal [1] => BETWEEN [2] => 1 AND 504 ) )
    $params vaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Array ( [:param1] => 1 [:param2] => 1 AND 504 )
    Vois-tu quelque chose qui ne serait pas bon ?

    Merci d'avance pour l'aide.

    bee

  7. #7
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Tu ne peux pas passer "1 AND 504" comme paramètre.
    Dans la requête ça donne BETWEEN "1 AND 504".
    Il faut deux paramètres :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    BETWEEN :minimum and :maximum
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  8. #8
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Ton code est inutilement compliqué

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    foreach($ligne as $field => $value)
       {		
    	if(trim($value) != '') {
             if($field == 'officine.adresse')
             {
                $conditions[] = $field . ' LIKE ?';
                $params[] = '%' . $value . '%';
             }
             elseif($field == "officine.ref_code_postal")
             {
                $min_max = explode('-',$value);
                $conditions[] = $field . ' BETWEEN ? AND ?';
                $params[] = min_max[0];
                $params[] = min_max[1];
             }
             elseif($field == "officine.pays")
             {
                $conditions[] = $field . ' = ?';
                $params[] = $value;
             }
    	else
             {
                $conditions[] = $field . ' LIKE ?';
                $params[] = '%' . $value . '%';
             }
        }
    }
    $chaine .= implode(' AND ', $conditions);
    $req = $conn->prepare($chaine);
    $req->execute($params);
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #9
    Membre expérimenté
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Par défaut
    Merci Sabotage pour ce bout de code.

    Ton code remplace tout le code de ma page où je dois garder une partie ?

    Encore merci pour vouloir améliorer et surtout faciliter mon code, c'est important pour moi.

    bee

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PDO] nombre de lignes nul avec PDO mais pas avec phpMyAdmin
    Par laurentSc dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 06/02/2015, 21h59
  2. Réponses: 1
    Dernier message: 04/11/2009, 15h33
  3. Réponses: 3
    Dernier message: 05/08/2009, 11h41
  4. Erreur 1064 CREATE TABLE avec cle reflexive
    Par ZuZu dans le forum Outils
    Réponses: 8
    Dernier message: 19/11/2007, 13h12
  5. Réponses: 3
    Dernier message: 13/06/2007, 14h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo