2012-10-10 135 views
-4
$query = ' 
PREPARE statement FROM 
"INSERT INTO games_new 
(
    gamedate, 
    hometeam, 
    visitors, 
    result, 
    matchreport, 
    battedfirst, 
    fieldedfirst, 
    battedfirstruns, 
    battedfirstextras, 
    battedfirsttotal, 
    battedsecond, 
    fieldedsecond, 
    battedsecondruns, 
    battedsecondextras, 
    battedsecondtotal 
) 
VALUES 
(
    ?,?,?,?,?,?,?,?,?,?,?,?,?,?,? 
) 
"'; 
$result = mysql_query($query); 
if (!$result) {die("Database access failed: " . mysql_error());} 
$query = 
'SET @gamedate = $_POST["gamedate"],' . 
'@hometeam = $_POST["hometeam"],' . 
'@visitors = $_POST["visitors"],' . 
'@result = $_POST["result"],' . 
'@matchreport = $_POST["matchreport"],' . 
'@battedfirst = $_POST["battedfirst"],' . 
'@fieldedfirst = $_POST["fieldedfirst"],' . 
'@battedfirstruns = $_POST["battedfirstruns"],' . 
'@battedfirstextras = $_POST["battedfirstextras"],' . 
'@battedfirsttotal = $_POST["battedfirsttotal"],' . 
'@battedsecond = $_POST["battedsecond"],' . 
'@fieldedsecond = $_POST["fieldedsecond"],' . 
'@battedsecondruns = $_POST["battedsecondruns"],' . 
'@battedsecondextras = $_POST["battedsecondextras"],' . 
'@battedsecondtotal = $_POST["battedsecondtotal"]' 
; 
$result = mysql_query($query); 
if (!$result) {die("Database access failed: " . mysql_error());} 
$query = ' 
EXECUTE statement USING 
    @gamedate, 
    @hometeam, 
    @visitors, 
    @result, 
    @matchreport, 
    @battedfirst, 
    @fieldedfirst, 
    @battedfirstruns, 
    @battedfirstextras, 
    @battedfirsttotal, 
    @battedsecond, 
    @fieldedsecond, 
    @battedsecondruns, 
    @battedsecondextras, 
    @battedsecondtotal 
'; 
$result = mysql_query($query); 
if (!$result) {die("Database access failed: " . mysql_error());} 
$query = 'DEALLOCATE PREPARE statement'; 
$result = mysql_query($query); 
if (!$result) {die("Database access failed: " . mysql_error());} 

我得到這個語法錯誤:PHP佔位符

數據庫訪問失敗:您的SQL語法錯誤;檢查 手冊,對應於您的MySQL服務器版本的右邊 語法使用附近'[「gamedate」],@ hometeam = $ _POST [「hometeam」],@ visitors = $ _POST [「visitor」],@結果'

任何想法?謝謝。

+7

你仍然很容易受到sql注入的影響,因爲你是首先在您的'SET'查詢中填入_POST數據。您完全不正確地使用佔位符,絕對沒有任何安全性。 –

+0

有什麼想法?是。您只需複製並製作一些東西,而無需查看手冊。 – mario

回答

1
$query = 
'SET @gamedate = $_POST["gamedate"],' . 

因爲這是單引號,因此不會評估$_POST["gamedate"]。你應該做的事:

$query = 
"SET @gamedate = {$_POST['gamedate']}," . 

但是,使用$_POST參數直接像讓您的網站通過SQL注入入侵最終。

+0

請不要「修復」這樣的代碼,然後啓用巨大的SQL注入漏洞。如果您必須使用'mysql_real_escape_string'來演示如何編寫工作代碼。 – tadman

+2

因此,注意@tadman。這裏的基本問題是單引號與雙引號,無論SQL注入問題如何,他都需要學習。 – ceejayoz

+0

如果你打算修復它,至少修復它。 ''SET @gamedate = {$ _POST ['gamedate']},「'甚至不接近正在使用的SQL。 – tadman

-2
'@battedsecond = $_POST["battedsecond"],' 

由於您使用的是簡單引號,因此無法將變量直接放入字符串中。使用雙引號或使用連接。

"@battedsecond = {$_POST["battedsecond"]}," 
//OR 
'@battedsecond = '.$_POST["battedsecond"].',' 
5

首先,學習單(')和雙("quoted strings in php之間的差異。

其次,mysql_函數aren't recommended已被使用了。使用MySQLiPDO

所以,你應該使用:

"SET @gamedate = '{$_POST['gamedate']}'" 

,而不是與'逃逸。或者說做:

'SET @gamedate = "' . mysql_real_escape_string($_POST['gamedate'], $conn) . '"' 

或者你也可以這樣做的正確的方式(例如,使用PDO::prepare):

$sql = 'SET @gamedate = :gamedate'; 
$sth = $dbh->prepare($sql); // $dbh is instance of PDO 
$sth->execute(array(':gamedate' => '...')); 
3

對於此用途:

mysqli_prepare ($link , $query); 

例子:

$mysqli = new mysqli("localhost", "user", "pwd", "db"); 
$stmt = mysqli_prepare($link, "INSERT INTO games_new 
(gamedate, hometeam, visitors, result, matchreport, battedfirst, fieldedfirst, battedfirstruns, battedfirstextras, battedfirsttotal, battedsecond, fieldedsecond, battedsecondruns, battedsecondextras, battedsecondtotal) 
VALUES 
(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"); 

mysqli_stmt_bind_param($stmt, "ssssssssssssss", 
    $_POST["hometeam"], 
    $_POST["visitors"], 
    $_POST["result"], 
    $_POST["matchreport"], 
    $_POST["battedfirst"], 
    $_POST["fieldedfirst"], 
    $_POST["battedfirstruns"], 
    $_POST["battedfirstextras"], 
    $_POST["battedfirsttotal"], 
    $_POST["battedsecond"], 
    $_POST["fieldedsecond"], 
    $_POST["battedsecondruns"], 
    $_POST["battedsecondextras"], 
    $_POST["battedsecondtotal"] 
); 

mysqli_stmt_execute($stmt); 
mysqli_stmt_close($stmt); 
mysqli_close($link); 
+0

+1爲'mysqli'。這是做這件事唯一安全的方法。命名的佔位符更容易處理,但是這可以完成這項工作。 – tadman

+2

這不是「唯一安全的方法」。 PDO更好。 – ceejayoz

+0

我的意思是使用像'?'那樣的佔位符,而不是'mysqli'。 – tadman