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

Php 如何使用mysqli为select查询准备语句,php,mysqli,sql-injection,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($Acous

我非常担心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()");
然而,这不起作用。我得到以下错误:
调用未定义的函数prepare()

我仍然希望将我的值设置为:

谁能给我指出正确的方向吗?

这个怎么样

$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)
如果您允许用户输入任何数据(在网站的文本框中)或从数据库中提取任何数据以供使用(有二次注射的风险),请确保使用
htmlspecialchars($category)
htmlentities($category)
对其进行消毒(清除任何讨厌的标签,如<或>)


在代码中实现此方法后,您将可以合理地避免SQL注入:)

尝试将此变量设置为全局变量:将其放在脚本的上半部分
global$audionicdb
或者你可以试试这个
$acoustic=''

谢谢您的回复,我已经尝试过了,但是现在结果无法显示,我可以看到以下错误:未定义变量$row\U AUSONATICDB。如何正确显示我的结果。感谢您使用添加的execute()查找,它只给了我一个空白页。任何想法都可以。再次感谢您的支持help@Ria我终于完成了我的回答:)很抱歉,谢谢您再次光临。很抱歉,我收到以下错误:调用未定义的方法mysqli_stmt::get_result()。这可能是由以下几个因素造成的-运行低于5.3.0的PHP版本,或者可能缺少SQLND DLL。尝试取消对php.ini文件中的行
extension=php\u mysqli\u mysqlnd.dll
的注释。如果这些都不能解决您的问题,您可以使用
bind\u result
来代替-请看这里:我认为您还没有完全理解mysqli的工作原理。请仔细阅读本手册。防止SQL注入的关键是不要使用包含不可信数据的变量生成SQL语句。您没有使用变量构建SQL语句,因此它们不易受到SQL注入的攻击。可能存在@AndyLester的重复项我认为不应将其归类为重复项,因为OP显示了SQL注入预防技术的知识,例如预先准备好的语句,但似乎不确定正确的语法,所以在MySQL中使用RAND也是一个非常糟糕的主意,因为这将在每次调用RAND函数时重写整个表,将整个MySQL表加载到一个PHP数组中,然后洗牌数组,效率要高得多。