2009-06-24 7 views
0

Bonjour à tous,Erreur dans la commande de mise à jour de MySQL. (en php)

J'utilise une commande de mise à jour en php pour mettre à jour les données dans mysql. C'est mon code:

$sql=mysql_query("UPDATE blpublication SET JournalName = '$_POST[journal]', AcceptanceDate = '$_POST[acceptancedate]', PublishedDate = '$_POST[publisheddate]', Comment = '$_POST[comment]' 
WHERE JobNo = '$_POST[jobno]'"); 

if (!mysql_query($sql,$con)) 
    { 
    die('Error: ' . mysql_error()); 
    } 
echo "record Updated"; 

Il met à jour le champ mais, il me donne l'erreur suivante. Et je ne peux pas comprendre pourquoi je reçois cette erreur. « Erreur: Vous avez une erreur dans votre syntaxe SQL, consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de « 1 » à la ligne 1 »

Pouvez-vous me aider dans cette

Meilleur Zeeshan

+1

Faire un "echo $ sql;" avant d'envoyer la requête au serveur MySQL pour vérifier ce qui est réellement envoyé au serveur. Notez également que vous ne devez JAMAIS mettre une entrée utilisateur directement dans une requête SQL (alias "injection SQL") - toujours filtrer, valider et/ou désinfecter l'entrée de l'utilisateur! –

+2

mon seigneur. c'est un hack d'injection sql qui n'attend que ça. –

+0

Tout à fait étrange que personne n'a suggéré une instruction préparée au lieu d'échapper à l'entrée. Voir http://stackoverflow.com/questions/60174/best-way-to-prevent-sql-injection-in-php par exemple. – mlt

Répondre

3

Pouvez-vous nous dire quelle est la sortie exacte de $sql? Par ailleurs, BIG trou de sécurité là. Vous devriez toujours entrées de requête d'échappement à savoir:

$journal = mysql_real_escape_string($_POST['journal']); 
$acceptance_date = mysql_real_escape_string($_POST['acceptancedate']); 
$publish_date = mysql_real_escape_string($_POST['publisheddate']); 
$comment = mysql_real_escape_string($_POST['comment']); 
$job_no = intval($_POST['jobno']); // assuming jobNo is a number 
$sql = <<<END 
UPDATE blpublication 
SET JournalName = '$journal', 
AcceptanceDate = '$acceptance_date', 
PublishedDate = '$publish_date', 
Comment = '$comment' 
WHERE JobNo = $jobno 
END; 
mysql_query($sql); 
if (mysql_error()) { 
    die("Error executing query '$sql': " . mysql_error()); 
} 
echo "record Updated"; 
+0

merci Cletus. Cela fonctionne parfaitement maintenant. :) –

2

Je désinfecterais d'abord votre entrée. Cela pourrait conduire à des erreurs très méchantes telles que ce que vous expérimentez et les attaques malveillantes. Rechercher SQL Injection.

1

similaires à la post suivante, je crois que lorsque vous avez un objet ou la syntaxe de tableau, vous devez mettre en accolades.

SET JournalName = '${_POST[journal]}' 

éditer: et oui, comme d'autres l'ont souligné, vous risquez une injection de sql.

+0

Ummmm ... mauvaise langue? Il n'y a pas de SET en PHP. Et vous pouvez aussi bien l'utiliser sans accolades. – soulmerge

+0

@soulmerge - le SET est dans la requête SQL. – Eli

+0

@soulmerge comme Eli a dit, j'ai écrêté l'exemple pour montrer juste un exemple de mon explication –

1

Tout d'abord, votre code est sujette à SQL injection, échapper à vos valeurs POST:

$journal = mysql_real_escape_string($_POST['journal']); 

Et pour déboguer réellement votre requête, nous avons besoin de la requête elle-même. Ajouter une instruction echo() avant l'exécution de la requête et afficher le résultat, les valeurs POST peuvent contenir une valeur inattendue.

+0

Mieux encore: [mysqli_real_escape_string] (http://php.net/manual/fr/mysqli.real-escape-string.php) –

2

Je pense que le problème est que vous exécutez deux fois mysql_query. La première fois que cela fonctionne et renvoie 1 (vrai), que vous attribuez à $ sql. Ensuite, vous appelez à nouveau mysql_query, en passant $ sql (ce qui équivaut à 1). Bien sûr, "1" n'est pas une requête SQL valide, donc vous obtenez l'erreur de syntaxe.

Je suis entièrement d'accord que vous devez désinfecter ces entrées!

+0

J'ai assaini ma contribution. merci –

1

Votre syntaxe UPDATE générale semble correcte, sauf pour les possibilités d'injection évidentes, mais vous devez générer $ sql. En regardant l'instruction SQL UPDATE dans votre code, une chose me saute aux yeux: l'une de vos variables contient probablement une citation ou un autre problème comme celui-ci ...

1

Le nom de la table est blpublication, est-ce qu'il vous manque peut-être un 't', c'est-à-dire tblpublication?

Vous devriez aussi vraiment désinfecter votre entrée, sinon vous allez être victime d'un SQL injection attack.

+0

Merci. J'ai désinfecté mes commentaires. et ça marche bien maintenant. Merci –

0

Essayez de concaténer les valeurs $ _POST. Je ne suis pas sûr si les inclure sans citer la clé est possible?

$sql= mysql_real_escape_string("UPDATE blpublication SET JournalName = '".$_POST['journal']."', AcceptanceDate = '".$_POST['acceptancedate']."', PublishedDate = '".$_POST['publisheddate']."', Comment = '".$_POST['comment']."' 
WHERE JobNo = '".$_POST['jobno']."'"); 
$result = mysql_query($sql); 

Remarque: les commandes mysql_ * sont dépréciées. Vous devriez passer à mysqli_*.

Questions connexes