2013-05-21 28 views
0

我一直在試圖讓過去的一天讓mysql識別我的PhP變量,但到目前爲止我還沒有運氣。如何在內部使用PHP變量加入MYSQL查詢?

代碼:

...connect to db... 
session_start(); 
//Calls up Session stored variable 
$currentUsr= $_SESSION['username']; 
//SQL Query 
$sql= 'SELECT Users.Username, books.* FROM Users 
     INNER JOIN UserLinkBooks lb 
     ON Users.Username = lb.Username 
     INNER JOIN Books 
     ON lb.bkTitle = books.Title 
     WHERE Users.Username = "$currentUsr"'; 
$result=mysqli_query($conn,$sql);                 
//Error Check 
if (!$result) {                     
    printf("Error: %s\n", mysqli_error($conn)); 
    exit();} 
//display row 
while($row=mysqli_fetch_array($result)){                           
    echo "<strong>".$row['Title']."</strong>".$row['Description']."</br>";} 

我的問題是,$ currentUsr沒有正確調用已傳遞的用戶名。在對它進行錯誤檢查之後,它似乎是空的。

我不明白的是,當我使用的代碼:

$sql = "SELECT * FROM Users WHERE `Username`='$currentUsr'"; 

變量進行處理,並能正常工作,調出書名的和描述完美。另外,如果我手動輸入: WHERE Users.UserName =「Bill」'; 它工作正常。

一些我從各種嘗試得到其他錯誤是:

WHERE Users.UserName = '.'$currentUsr'; 
    Error: Unknown column '$currentUsr' in 'where clause' 

WHERE Users.UserName = '.$currentUsr; 
    Error: Unknown column 'Bill' in 'where clause' 

任何幫助將不勝感激。謝謝

+0

PHP字符串的行爲有所不同,具體取決於它們是雙引號還是單引號。 –

+1

只要確定你的用戶不是Bobby Tables(http://xkcd.com/327/)。任何用戶提供的輸入都應該包含在'mysql_real_escape_string'中,或者更好:http://www.php.net/manual/en/mysqli.prepare.php – Joshmaker

+0

一些友好的建議是使用User.id而不是User.UserName。這是被稱爲「數據規範化」的更大概念的一部分,並且學習它可以節省您的頭髮,因爲在UTF-8字符集中,'Bill'和'Bïll'和'Bîll'會意外最終成爲相同的用戶,但外鍵1001,1802和2242明顯是不同的用戶。 – Strixy

回答

1

您的變量位於單引號字符串中,防止插值。你可以嘗試:

$sql = "SELECT Users.Username, books.* FROM Users 
     INNER JOIN UserLinkBooks lb 
     ON Users.Username = lb.Username 
     INNER JOIN Books 
     ON lb.bkTitle = books.Title 
     WHERE Users.Username = '" . $currentUsr ."'"; 

在我看來,使用連接使代碼更具可讀性。話雖如此,你應該考慮使用參數化查詢,因爲它們減少了注入問題。 Mysqli有這樣的能力。

+0

謝謝,這使我的代碼實際上工作:) – user2403038

0

如果使用雙引號,然後把你的變量在大括號 - 使用別的Concatinatoin用點。