Page 1 sur 2
erreurs mysql
Posté : 08 oct. 2005, 12:37
par donatello
Bonjour,
pour afficher mes erreurs sql, j'utilise
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é

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

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é

Pas tout à fait, il a cité mysql_error et non mysql_errno

ah bon tu crois... et ça
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

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])) ? ", " : "); ");
}