2013-03-04 55 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級別準備和執行。