2011-01-28 2 views
3

Im apprendre MySQLi afin de rendre mon site non vulnérable aux injections SQL (qui est maintenant) mais je suis confus quand j'essayais de "traduire" mes vieilles querys aux déclarations MySQLi, donc j'espère que vous pouvez m'aider avec quelques exemples afin que je puisse l'obtenir. Merci beaucoup!.Comment passer de MySQL à une requête MySQLi vulnérable à une requête MySQLi non vulnérable

Mise à jour mon site contre

$sql = "UPDATE post SET counter = counter+1 WHERE id=".$tget; 

Trier mes commentaires

$info=mysql_query("SELECT * FROM `comments` WHERE idpost=" . $tget . " AND active=1 ORDER BY datetime DESC"); 

Sauver le commentaire

$sql = "INSERT INTO `comments` (`id`, `idpost`, `comment`, `datetime`, `author`, `active`) VALUES (NULL, '" . addslashes($_POST['idcomment']) . "', '" . addslashes($_POST['comment']) . "', NOW(), '" . addslashes($_POST['name']) . "', '1');"; 

Si vous pouvez m'expliquer comment aller d'ici à MySQLi je peux finir avec les autres questions. Et en passant, si vous (expert) estimez qu'il existe un autre moyen de me protéger des injections sql mieux que MySQLi, s'il vous plaît dites-moi à ce sujet.

+0

Je ne suis pas un expert, mais il y a une autre façon, on l'appelle AOP: http://www.php.net/manual/en/book.pdo.php – Nacho

Répondre

4
$conn = new mysqli(…); 
$sql = "UPDATE post SET counter = counter+ 1 WHERE id= ?"; 
$stmt = $conn->prepare($sql); 
$stmt->bind_param("i", $tget); 
$stmt->execute(); 

Dans le premier argument de bind_param, utiliser une chaîne de i, s, d et b pour définir les types de paramètres:

$stmt = $conn->prepare("INSERT INTO mytable (int_column, string_column, double_column, blob_column, another_int_column VALUES (?, ?, ?, ?, ?)"); 
$stmt->bind_param("isdbi", $int_val, $string_val, $double_val, $blob_val, $another_int_val); 
$stmt->execute(); 
+1

Si pas '$ stmt-> execute; 'be' $ stmt-> execute(); '? Et ne devriez-vous pas avoir '$ stmt-> close();' après chaque requête? –

+1

@Rocket: sûr, mis à jour. Il devrait aussi y avoir '$ stmt-> fetch()' pour les requêtes 'SELECT', mais je l'ai omis par souci de concision, puisque le @op voulait savoir comment lier. – Quassnoi