erreurs mysql

donatello
Invité n'ayant pas de compte PHPfrance

08 oct. 2005, 12:37

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?

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

08 oct. 2005, 12:49

Il n'y en as pas d'autres... tu n'a pas assez d'informations avec ceux-la ?

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Mammouth du PHP | 19672 Messages

08 oct. 2005, 12:49

Tu as mysql_errno() qui va te sortir le numéro de l'erreur et tu as la liste ICI
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

08 oct. 2005, 12:50

Tu as mysql_errno()
Il l'avait cité :wink:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Mammouth du PHP | 19672 Messages

08 oct. 2005, 12:53

Tu as mysql_errno()
Il l'avait cité :wink:
Pas tout à fait, il a cité mysql_error et non mysql_errno ;)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Invité
Invité n'ayant pas de compte PHPfrance

08 oct. 2005, 12:57

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...

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

08 oct. 2005, 13:16

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

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Mammouth du PHP | 19672 Messages

08 oct. 2005, 13:20

T'as raison, autant pour moi.

Comme dit Truc, sans le code PHP, on devinera pas.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Invité
Invité n'ayant pas de compte PHPfrance

08 oct. 2005, 13:25

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]

Invité
Invité n'ayant pas de compte PHPfrance

08 oct. 2005, 13:28

désolé pour le double

Mammouth du PHP | 19672 Messages

08 oct. 2005, 13:28

On avait pas besoin de deux pages de code: juste la partie qui contient la requête :shock:
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Invité
Invité n'ayant pas de compte PHPfrance

08 oct. 2005, 13:29

c'est le même code en double

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

08 oct. 2005, 13:30

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

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Invité
Invité n'ayant pas de compte PHPfrance

08 oct. 2005, 13:35

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

Mammouth du PHP | 19672 Messages

08 oct. 2005, 13:38

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])) ? ", " : "); ");
    }
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: