2017-10-11 11 views
-1

J'essaie d'éviter l'injection SQL en PHP avec PDO. J'ai utilisé ceci comme référence. http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers. Mon code ne me donne aucune erreur mais les valeurs qui entrent sont toutes nulles.PHP SQL Injection Prevent

Les vlaues que j'essaie d'insérer sont et non null. Je le sais parce que je les ai echo'ed sur: echo "\nDate: ".$date." Name: ".$name." mail: ".$mail."Comment: ".$comment." website: ".$website;

$sql = "INSERT post SET timeDate = :timeDate and name = :name and mail = :mail and comment = :comment and website = :website"; 
$stmt = $db->prepare($sql); 
$stmt->bindParam(":timeDate", $date); 
$stmt->bindParam(":name", $name); 
$stmt->bindParam(":mail", $mail); 
$stmt->bindParam(":comment", $comment); 
$stmt->bindParam(":website", $website); 
$stmt->execute(); 
+3

Vous devez d'abord apprendre ** la syntaxe SQL de base **. https://dev.mysql.com/doc/refman/5.7/en/update.html –

+0

Sur une note de côté, vous ne avez pas réellement besoin d'un tel code long et sinueux, deux lignes sont en fait assez: [Exemples AOP: UPDATE requête en utilisant PDO] (https://phpdelusions.net/pdo_examples/update) –

+0

'$ sql =" INSERT post SET nom = ?, mail =? ";' '$ db-> préparer ($ sql) -> execute ([$ name, $ mail]); 'Mais cette injection est-elle sûre? – Fig

Répondre

0

Ne pas utiliser AND entre vos virgules missions d'utilisation.

$sql = "INSERT post 
     SET timeDate = :timeDate, 
      name = :name, 
      mail = :mail, 
      comment = :comment, 
      website = :website"; 

Votre déclaration en utilisant AND entre les termes est aucune erreur, car l'instruction est en fait valable. Cela ne fait tout simplement pas ce que vous pensiez.

Il est comme si vous l'avez fait:

SET timeDate = (:timeDate and name = :name and mail = :mail and comment = :comment and website = :website") 

Ceci définit uniquement timedate le résultat d'une longue expression booléenne.

Les autres colonnes ne reçoivent pas rien affectées, ils sont juste être comparées aux valeurs paramétrées. Comme il s'agit d'une nouvelle ligne que vous n'avez pas encore insérée, toutes les autres colonnes sont naturellement NULL, donc les comparaisons seront NULL. Par conséquent, AND - les ensemble sera NULL, et c'est la valeur ultime qui sera affectée à votre colonne timeDate.

Les autres colonnes n'ont aucune valeur dans cette instruction et leur valeur par défaut est vraisemblablement NULL.

Ceci est une déclaration bizarre et inutile, mais à proprement parler, ce n'est pas une erreur.

Je vous encourage aussi à utiliser PDO plus simplement. Au lieu d'utiliser bindParam() pour tout, vous pouvez passer un tableau à execute(). Cela fait la même chose que si vous aviez fait bindValue() pour chacun des paramètres. Vous pouvez le faire avec des paramètres nommés ou des paramètres de position.

$stmt = $db->prepare($sql); 
$stmt->execute([ 
    "timeDate" => $date, 
    "name" => $name, 
    "mail" => $mail, 
    "comment" => $comment, 
    "website" => $website]); 

Ceci est particulièrement utile si vous avez déjà vos valeurs de paramètres stockées dans un tableau. La protection contre l'injection SQL est tout aussi bonne que l'utilisation bindParam().