我無法使這個看似簡單的MySql查詢工作。任何人都可以發現問題嗎?PHP和MySql的問題
<?php
include "config.php";
$offerid = $_POST["offerid"];
$ip = $_SERVER["REMOTE_ADDR"];
mysql_query("INSERT INTO voted (offerid,ip) VALUES (".$offerid.",".$ip.")");
?>
我無法使這個看似簡單的MySql查詢工作。任何人都可以發現問題嗎?PHP和MySql的問題
<?php
include "config.php";
$offerid = $_POST["offerid"];
$ip = $_SERVER["REMOTE_ADDR"];
mysql_query("INSERT INTO voted (offerid,ip) VALUES (".$offerid.",".$ip.")");
?>
你可能需要一些單引號:
"INSERT INTO voted (offerid,ip) VALUES ('" . $offerid . "','" . $ip . "')"
您還應該使用intval
和mysql_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));
我的猜測是帶引號的
mysql_query("INSERT INTO voted (offerid,ip) VALUES (\"".$offerid."\",\"".$ip."\")");
要放置一個字符串值到查詢,則必須對其執行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
部分。
它會爲您提供全面的信息對任何錯誤
+1用於錯誤處理。 – 2010-05-30 18:26:44
<?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函數,將難逃(添加反斜線盈方的)任何安全風險人物。
除了使用intval(...)
和mysql_real_escape_string(...)
你可以使用PEAR::DB或PEAR::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。同樣,它所描述的模塊已經被取代,但是我發現它仍然很有趣並且信息豐富。
只是爲了增加重點:如果您不使用'mysql_real_escape_string'或準備好的語句或某些東西來防止黑客入侵,**您將被黑客攻擊**。 – Matchu 2010-05-30 18:05:52
@Mark Byers - 無論如何,如果你傳入一個整數,單引號應該在那裏嗎? – Matchu 2010-05-30 18:07:00
@Matchu它不是黑客預防。這只是語法。 – 2010-05-30 18:14:37