php - 将 mysql_query 转换为 PDO 语句

标签 php mysql sql-injection

虽然有大量的 PDO 使用示例,但我无法成功地将 mysql_query 转换为 PDO 语句。

这是有效但不安全的方法:

<?php
$db = mysql_connect("localhost","username","passphrase");
mysql_select_db("database",$db);
$cat= $_GET["cat"];
/* grab a row and print what we need */
$result = mysql_query("SELECT * FROM cat WHERE cat = '$cat' ",$db);
$myrow3 = mysql_fetch_row($result);
echo "$myrow3[2]";
/* here's an array */
echo '<div class="container">';
$q = mysql_query("SELECT * FROM name WHERE Field4 = '$cat'",$db);
while ($res = mysql_fetch_array($q)){
    echo '<div class="item"><p><a href="bits.php?page=' . $res['Field2'] . '&' . $res['Field6'] . '">' . $res['Field1'] . '</a></p></div>';
}
echo '</div>';
?>

到目前为止,这是我尝试将 mysql_query* 转换为基于 How to prevent SQL injection in PHP? 的 PDO 语句的尝试。 .当前该页面不显示任何内容。任何见解将不胜感激!

<?php

$pdo = new PDO('mysql:host=localhost;dbname=database','username','password');
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$cat= $_GET["cat"];
/* let try grabbing one of those rows, do not think an array should be here? */
$stmt = $pdo->prepare('SELECT * FROM cat WHERE cat = :cat');
$stmt->bindParam(':cat', $cat);
$result = $stmt->fetch(PDO::FETCH_ASSOC);
echo $result[2];
/* Now we need an array similar to what we had before */
echo '<div class="container">';
$stmt = $pdo->prepare('SELECT * FROM name WHERE Field4 = :Field4');
while ($res = $stmt->execute(array(':cat' => $cat))) {
    echo '<div class="item"><p><a href="bits.php?page=' . $res['Field2'] . '&' . $res['Field6'] . '">' . $res['Field1'] . '</a></p></div>';
}
echo '</div>';
?>

最佳答案

首先,您这样做并不能保护您。

PDO 语句应如下所示(来自手册):

$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);

因此,对于您的示例:

$stmt = $pdo->prepare('SELECT * FROM cat WHERE cat = :cat');
$stmt->bindParam(':cat', $cat);
$result = $stmt->fetch(PDO::FETCH_ASSOC);

或者你可以这样做:

$stmt = $pdo->prepare("SELECT * FROM cat where cat = ?");
if ($stmt->execute(array($cat)) {
  while ($row = $stmt->fetch()) {
    //print stuff or whatever
  }
}

最后,在你的最后一部分:

while $stmt->execute(array(':cat' => $cat));
echo '<div class="item"><p><a href="bits.php?page=' . $res['Field2'] . '&' . $res['Field6'] . '">' . $res['Field1'] . '</a></p></div>';

看起来 $res 从未被设置过。它应该看起来像:

while ($res = $stmt->execute(array(':cat' => $cat)) {
    echo '<div class="item"><p><a href="bits.php?page=' . $res['Field2'] . 
         '&' . $res['Field6'] . '">' . $res['Field1'] . '</a></p></div>';
}

关于php - 将 mysql_query 转换为 PDO 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16616498/

相关文章:

mysql - 使用 LIKE 运算符时如何防止 SQL 注入(inject)?

php - 从请求重定向到同一页面(不起作用)。拉拉维尔 5.4

mysql - SQL:将两个查询组合成一个查询

php - 检查数据库中是否已存在用户名或电子邮件

mysql - 重写 MySQL 代码以检索平均时间

mysql - 使用 WordPress get_results() 数据库函数是否可以防止 sql 注入(inject)

python - PyMySQL - 转义标识符

php - 帮助创建 ZIP 文件 Windows 不会阻止

javascript - 加载图像间歇性失败 - ERR_CONTENT_LENGTH_MISMATCH

javascript - Chart.js 和 PHP