如何使用mysqli为select查询准备语句

时间:2015-02-12 14:17:12

标签: php mysqli sql-injection

我非常担心sql注入。我一直在阅读它,并一直在尝试准备以下查询:

$query_AcousticDB = "SELECT * FROM products WHERE Category = 'Acoustic ' ORDER BY RAND()";
$AcousticDB = mysqli_query($DB, $query_AcousticDB) or die(mysqli_connect_error());
$row_AcousticDB = mysqli_fetch_assoc($AcousticDB);
$totalRows_AcousticDB = mysqli_num_rows($AcousticDB);

效果很好。

我认为我只需要改为:

$query_AcousticDB = prepare("SELECT * FROM products WHERE Category = 'Acoustic ' ORDER BY RAND()");

然而,这不起作用。我收到以下错误:Call to undefined function prepare()

我仍然希望将我的值设为:<?php echo $row_AcousticDB['what ever']; ?>

有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:1)

这个怎么样?

$category = "Acoustic";

$sql = "SELECT * FROM products WHERE Category = ? ORDER BY RAND()";
$stmt = $DB->prepare($sql);
$stmt->bind_param('s', $category);

$stmt->execute();
$row_AcousticDB = $stmt->get_result(); // altenative: $stmt->bind_result($row_AcousticDB);
$row_AcousticDB->fetch_array(MYSQLI_ASSOC)

如果您让用户输入任何数据(在网站上的文本框中)或您从数据库中提取任何内容(二次注入的风险),请确保您清理它(清除任何讨厌的标签,如&lt;或&gt;)使用htmlspecialchars($category)htmlentities($category)

通过在代码中实现此方法,您将在SQL注入中相当安全:)

答案 1 :(得分:0)

尝试将此变量设为全局:将其放在脚本global $acousticDB;的上半部分,否则您可以尝试此$acoustic='';