2013-03-04 121 views
2

是否可以在PHP中使用使用已弃用的mysql扩展的预准备语句?我有一台服务器不会很快得到mysqli或PDO,需要对用户提供的文本进行RLIKE查找。 mysql_real_escape_string()将被使用,但我担心它会不够。PHP准备好的语句没有mysqli或PDO

+2

您使用的PHP版本的年龄?没有mysqli?它是在5.0版本的php中引入的,对于PDO也是一样(没有标准,但是从那以后可以轻松安装)。 – 2013-03-04 23:29:00

+0

这是服务器上的糟糕情况。明年有计划获得一个标准的LAMP盒子并将他们的旧代码迁移到PDO,但目前系统管理员表示FreeBSD有几个版本过期,他不愿意尝试升级或重新编译任何东西,以免破损。 – jerrygarciuh 2013-03-04 23:34:34

+2

在用户空间中,对于PHP4.x和更早的5.0版本,有一个PDO重新实现。见http://xpdo.org/或http://ge.tt/44rtW5a/v/0 – mario 2013-03-04 23:35:56

回答

2

下面是一个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级别准备和执行。