是否可以使用已弃用的 mysql 来使用准备好的语句PHP 中的扩展?我有一台服务器不会很快获得 mysqli 或 PDO,并且需要对用户提供的文本进行 RLIKE 查找。将使用 mysql_real_escape_string() 但我担心它不够。
最佳答案
这是一个 PHP 脚本,使用已弃用的 mysql API,演示了如何使用 PREPARE 和 EXECUTE。我用 PHP 5.3.15 和 MySQL 5.5.29 对此进行了测试,它对我有用。不过,我不推荐这样做。
<?php
$x = 3;
$y = 4;
mysql_connect('localhost', 'root', 'xxxx') or die(mysql_error());
mysql_select_db('test');
mysql_query("SET @sql = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse'");
mysql_query("PREPARE stmt FROM @sql");
mysql_query("SET @x = $x"); // SQL injection!
mysql_query("SET @y = $y"); // SQL injection!
$result = mysql_query("EXECUTE stmt USING @x, @y");
while ($row = mysql_fetch_assoc($result)) {
print $row["hypotenuse"] . "\n";
}
mysql_close();
正如我在评论中指出的,这种做法忽略了准备好的查询的要点,因为您必须将可能不受信任的内容插入到 SET 语句中。
您确实应该修复 PHP 安装并启用 mysqli 或 PDO_mysql 扩展,以便您可以使用真正的 API 级准备和执行。
关于没有 mysqli 或 PDO 的 PHP 准备语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15213110/