Page 1 sur 2

erreurs mysql

Posté : 08 oct. 2005, 12:37
par donatello
Bonjour,
pour afficher mes erreurs sql, j'utilise

Code : Tout sélectionner

echo mysql_error().mysql_errno();
ya t il d'autres instructions complémentaires qui permettent d'en savoir plus sur l'erreur?

Posté : 08 oct. 2005, 12:49
par Truc
Il n'y en as pas d'autres... tu n'a pas assez d'informations avec ceux-la ?

Posté : 08 oct. 2005, 12:49
par Cyrano
Tu as mysql_errno() qui va te sortir le numéro de l'erreur et tu as la liste ICI

Posté : 08 oct. 2005, 12:50
par Truc
Tu as mysql_errno()
Il l'avait cité :wink:

Posté : 08 oct. 2005, 12:53
par Cyrano
Tu as mysql_errno()
Il l'avait cité :wink:
Pas tout à fait, il a cité mysql_error et non mysql_errno ;)

Posté : 08 oct. 2005, 12:57
par Invité
en fait j'ai un truc très étrange.
J'ai un script qui génère et affiche une requête sql.
Quand je copie la requête et que je la colle dans phpmyadmin pour l'exécuter, tout se passe bien.
Par contre, quand je l'exécute avec mysql_query(), j'ai l'erreur
1064 Erreur de syntaxe près de
Je veux bien qu'il y ait une erreur, mais dans ce cas un copier/coller dans phpmyadmin ne devrait pas fonctionner...

Posté : 08 oct. 2005, 13:16
par Truc
Tu as mysql_errno()
Il l'avait cité :wink:
Pas tout à fait, il a cité mysql_error et non mysql_errno ;)
ah bon tu crois... et ça :langue:
echo mysql_error().mysql_errno();
Bref, montre le code php associé a la requete, d'apres la liste des erreur 1064 corresponderai a une erreur de quote

Posté : 08 oct. 2005, 13:20
par Cyrano
T'as raison, autant pour moi.

Comme dit Truc, sans le code PHP, on devinera pas.

Posté : 08 oct. 2005, 13:25
par Invité
heu, il est assez long, je sais pas si vous allez avoir envie de suivre...on verra.
C'est un code qui récupère un fichier csv et qui le transforme en requête sql.
Je précise que la requête est très bien générée et qu'elle fonctionne quand on la copie dans phpmyadmin.

Code : Tout sélectionner

/* Paramétrage */ //Nom de la table: $table = "occasions"; //Séparateur : $separateur = ";"; //La première ligne correspond aux champs $firstline = "non"; //La première colonne est l\'identifiant $firstcol = "non"; //Fichier à convertir: $type = "onserver"; //Nom fichier: $fichier_s = "test.csv"; /* Variables */ $lignes = array(); $erreurs = array(); $separateur = (empty($separateur)) ? ";" : $separateur; $table = ((empty($table)) ? "no_title" : $table); /* En cas d'upload */ if($type == "upload") { $fichier = $_FILES['fichier_u']['tmp_name']; } else { /* Vérifie que le fichier existe sur le serveur */ $fichier = $fichier_s; if (!file_exists($fichier)) { echo "<span class='erreur'>Fichier introuvable !<br>Importation stoppée.</span>"; exit; } } /* Ouvre le fichier */ $fichier = file($fichier); /* Enleve les caracteres speciaux de fin de ligne */ $fichier = str_replace(chr(10), "", $fichier); $fichier = str_replace(chr(13), "", $fichier); /* Place tout dans un tableau */ foreach($fichier as $ligne) { $champs = explode($separateur, $ligne); array_push($lignes, $champs); } $requete = ""; if(isset($firstline) AND $firstline == "oui") { /* Insertion des commentaires */ $i = 0; $nb_col = count($lignes[0]); $requete .= "CREATE TABLE $table ("; while(isset($lignes[0][$i])) { /* Trouve le max et le type */ $retour = FindMaxType($lignes, $i); /* Si champ sans nom, attribution d'un nom automatique */ $lignes[0][$i] = (($lignes[0][$i] == "") ? "no_title$i" : $lignes[0][$i]); /* Mets la ligne */ $requete .= "`".mysql_escape_string(strtr($lignes[0][$i], " ", "_"))."`"; /* Ajoute le type de champ */ $requete .= (($retour[1] == "Y") ? " INT($retour[0])" : " VARCHAR($retour[0])"); /* Cree l'identifiant si necessaire & si possible */ if($i==0 AND isset($firstcol) AND $firstcol=="oui") { if($retour[1]=="Y") # Si que des chiffres { $requete .= " PRIMARY KEY NOT NULL AUTO_INCREMENT"; } else { array_push($erreurs,"La première colonne ne peut pas être un identifiant car elle ne contient pas que des valeurs numériques."); } } $i++; /* Termine l'affichage par , ou par ; */ $requete .= ((isset($lignes[0][$i])) ? ", " : ");"); } /* Supprime la premiere ligne du tableau */ array_shift($lignes); } /* Insertion des commentaires */ $j = 2; $k = 0; /* Génère les enregistrements */ foreach($lignes as $ligne) { $k = $k+1; unset($classe, $title); $classe = ""; $title = "Nombre d'enregistrements : ".count($ligne); $i = 0; /* Erreur dans le fichier */ if(isset($firstline) AND $firstline == "oui" AND count($ligne)!=$nb_col) { $title = "Ligne $j: nombre d'enregistrements (".count($ligne).") différent du nombre de champs de la table ($nb_col)."; $classe = "erreur"; if(!in_array("Des erreurs de nombre de champs ont été détectées dans le fichier !",$erreurs)) { array_push($erreurs,"Des erreurs de nombre de champs ont été détectées dans le fichier !"); } } $requete .= 'INSERT INTO '.$table.' VALUES ("'.$k.'",'; while(isset($ligne[$i])) { $requete .= "\"".mysql_escape_string(trim($ligne[$i]))."\""; $i++; $requete .= ((isset($ligne[$i])) ? ", " : "); "); } $j++; } /* Affichage des erreurs */ foreach($erreurs as $value) { echo "<li><span class='erreur'>$value</span></li>"; } /* Affichage des requetes */ echo "<br><hr size=1>$requete"; /* connexion et insertion dans la base */ connexion(); $result = mysql_query($requete); if (!($result)) { echo mysql_error().mysql_errno(); } mysql_close();
[/quote]

Posté : 08 oct. 2005, 13:28
par Invité
désolé pour le double

Posté : 08 oct. 2005, 13:28
par Cyrano
On avait pas besoin de deux pages de code: juste la partie qui contient la requête :shock:

Posté : 08 oct. 2005, 13:29
par Invité
c'est le même code en double

Posté : 08 oct. 2005, 13:30
par Truc
tu peut montrer a quoi ressemble la requete générée ... echo $requete;

Il me semble que cette condition ne sera jamais verifié (dans le cas du else en tout cas)
$requete .= ((isset($ligne[$i])) ? ", " : "); ");
a cause du while qui limite deja ce test

Posté : 08 oct. 2005, 13:35
par Invité
voici le résultat

Code : Tout sélectionner

INSERT INTO occasions VALUES ("1","prau", "PRESTIGE AUTOMOBILES", "", "ORLEANS", "31782", "2004", "10/08/2004", "VP", "FIAT", "Panda 1.3 JTD70 Multijet 16v Class", "MFT5112EN550", "CI", "GO", "4", "4", "43210", "Réels", "JAUNE VANILL", "0", "N", "12 mois pièces et main d\'oeuvre", "PITHIVIERS", "Anti-blocage des roues|Coussins gonflables|Direction assistée|Vitres électr. et fermeture centralisée|Radio CD"); INSERT INTO occasions VALUES ("2","prau", "PRESTIGE AUTOMOBILES", "", "ORLEANS", "31803", "2004", "16/12/2004", "CTTE", "FORD", "Connect Fg T200 TDCI 75CV", "PT2BHPABB", "Fourgon", "GO", "7", "2", "24642", "Réels", "BLANC", "10500", "O", "12 mois pièces et main d\'oeuvre", "ORLEANS", "Direction assistée");
il y a 93 insert comme ça, + le message d'erreur
Erreur de syntaxe près de '; INSERT INTO occasions VALUES ("2","prau", "PRESTIGE AUTOMOBILE' à la ligne 11064
qui correspond au début du 2ème insert que l'on voit ici

Posté : 08 oct. 2005, 13:38
par Cyrano
Ouais, j'ai viré le double. Bon, tu vas faire une chose:
echo("<p>". $requete ."</p>\n");
Récupère ce que ça affiche et colle nous ça ici si tu ne vois pas l'erreur toi-même avant.

À priori, ça se passe au niveau des requêtes d'insertion à modifier comme ceci:
//.....
    $requete .= "INSERT INTO ".$table." VALUES ('". $k ."','";
    while(isset($ligne[$i]))
    {
        $requete .= "'".mysql_escape_string(trim($ligne[$i]))."'";
        $i++;
        $requete .= ((isset($ligne[$i])) ? ", " : "); ");
    }