2016-10-19 50 views
0

我有一個已經被驗證爲工作下面的SQL語句:這個基於PHP的SQL語句的正確語法是什麼?

INSERT INTO community_players (community_id, player_id) 
SELECT communities.id, users.id 
FROM communities INNER JOIN users ON communities.admin = users.user_email 
WHERE users.user_email = '[email protected]' 
AND communities.code = 'HX99f9' 

我現在想在下面的PHP函數的變量替換虛擬郵箱和社區代碼數據,並將其提交到數據庫。

這是我的函數:

public function insertNewAdminIntoCommunity($email, $code) 
{ 
$sql = "insert into community_players (community_id, player_id) select communuities.id, users.id from communuities inner join users on communities.admin = users.user_email where users.user_email = '".$email."' and communities.code = '".$code."'"; 
$statement = $this->conn->prepare($sql); 

if(!$statement) throw new Exception($statement->error); 

$statement->bind_param("ss", $email, $code); 
$returnValue = $statement->execute(); 

return $returnValue; 
} 

但是它拋出的錯誤回到Xcode的 - 我以爲也許我試圖使用SQL語句中的函數變量時不正確的語法?

任何想法?

感謝

+1

你想使用PDO嗎?你的連接對象是什麼?也請顯示錯誤。 –

回答

2

你不應該將這些變量到SQL字符串,因爲你在這裏做的:

users.user_email = '".$email."' and communities.code = '".$code."'"; 

爲失敗準備語句的全部目的。已準備好的語句通過允許您定義將被正確轉義的值替換的佔位符來幫助防止SQL-injection

因此,應該使用佔位符(問號,沒有周圍的引號):

users.user_email = ? and communities.code = ?"; 

什麼$statement->bind_param("ss", $email, $code);然後呢,就是你的綁定變量的兩個佔位符。第一個參數的每個s表示應該將相應的值視爲字符串。 MySQL負責以這種方式正確地轉義值。

因此,錯誤很可能是告訴您,您正試圖將值綁定到不存在的佔位符。


  1. 更多可用的選項查看mysqli_stmt::bind_param() documentation
0

你必須在一些領域的communuities和社區其他 確保你在所有的情況下

$sql = "insert into community_players (community_id, player_id) 
     select communuities.id, users.id 
     from communuities 
     inner join users on communities.admin = users.user_email 
     where users.user_email = '".$email."' and communities.code = '".$code. "'"; 

使用了正確的表名,我建議用結合PARAM代替字符串連接使用PDO。 (和其他連接)

相關問題