2010-05-30 101 views
1

我無法使這個看似簡單的MySql查詢工作。任何人都可以發現問題嗎?PHP和MySql的問題

<?php 
include "config.php"; 

$offerid = $_POST["offerid"]; 
$ip = $_SERVER["REMOTE_ADDR"]; 

mysql_query("INSERT INTO voted (offerid,ip) VALUES (".$offerid.",".$ip.")"); 
?> 

回答

5

你可能需要一些單引號:

"INSERT INTO voted (offerid,ip) VALUES ('" . $offerid . "','" . $ip . "')" 

您還應該使用intvalmysql_real_escape_string避免SQL注入漏洞:

$sql = "INSERT INTO voted (offerid,ip) VALUES (" . 
     intval($offerid). ", '" . 
     mysql_real_escape_string($ip) . "')"; 

另一種選擇可能是更容易閱讀是使用sprintf

$sql = sprintf("INSERT INTO voted (offerid, ip) VALUES (%d, '%s')", 
       $offerid, mysql_real_escape_string($ip)); 
+0

只是爲了增加重點:如果您不使用'mysql_real_escape_string'或準備好的語句或某些東西來防止黑客入侵,**您將被黑客攻擊**。 – Matchu 2010-05-30 18:05:52

+0

@Mark Byers - 無論如何,如果你傳入一個整數,單引號應該在那裏嗎? – Matchu 2010-05-30 18:07:00

+0

@Matchu它不是黑客預防。這只是語法。 – 2010-05-30 18:14:37

0

我的猜測是帶引號的

mysql_query("INSERT INTO voted (offerid,ip) VALUES (\"".$offerid."\",\"".$ip."\")"); 
1

要放置一個字符串值到查詢,則必須對其執行2個操作:

  • 放在引號

  • 和轉義特殊字符。

所以,查詢必須是這樣的:

INSERT INTO voted (text) VALUES ('I\'m a programmer') 

有了這些知識,你可以很容易地編寫代碼,使有效的查詢:

$offerid = mysql_real_escape_string($_POST["offerid"]); 
$ip = mysql_real_escape_string($_SERVER["REMOTE_ADDR"]); 

$sql = "INSERT INTO voted (offerid,ip) VALUES ('$offerid','$ip')" 
mysql_query($sql) or trigger_error(mysql_error().$sql); 

注意trigger_error部分。
它會爲您提供全面的信息對任何錯誤

+0

+1用於錯誤處理。 – 2010-05-30 18:26:44

0
<?php 
include "config.php"; 

$offerid = $_POST["offerid"]; 
$ip = $_SERVER["REMOTE_ADDR"]; 

mysql_query("INSERT INTO voted (offerid,ip) VALUES ('".mysql_real_escape_string ($offerid)."','".mysql_real_escape_string ($ip)."')"); 
?> 

這會增加你的周圍插入的字符串單引號 - 以及mysql_real_escape_string PHP函數,將難逃(添加反斜線盈方的)任何安全風險人物。

0

除了使用intval(...)mysql_real_escape_string(...)你可以使用PEAR::DBPEAR::MDB2使用parameterized statements(或佔位符):

$dsn = "mysqli://testuser:[email protected]/test"; 
$conn =& DB::connect ($dsn); // using PEAR::DB, though it's been superseded 
if (DB::isError ($conn)) { 
    die ("Cannot connect: " . $conn->getMessage() . "\n"); 
} 

$result =& $conn->query ("INSERT INTO voted (offerid,ip) VALUES (?,?)", array($_POST["offerid"], $_SERVER["REMOTE_ADDR"])); 
if (DB::isError ($result)) { 
    die ("INSERT failed: " . $result->getMessage() . "\n"); 
} 

使用佔位符和參數上比PHP等平臺上很常見的,所以它不是一個壞主意瞭解其背後的基本前提。

如果您有興趣使用這些數據庫模塊,我建議您查看Paul DuBois的Writing Scripts with PHP's PEAR DB Module。同樣,它所描述的模塊已經被取代,但是我發現它仍然很有趣並且信息豐富。