2013-05-15 91 views
-1

我想從一個mysql表中使用兩個表單變量,即$ sessionID和$ semesterID獲取結果。我用下面的代碼,它似乎有一個錯誤的SQL語法使用表單變量爲mysql查詢

<?php 
... 
mysql_select_db($database_connChePortal, $connChePortal); 
$query_rsRegcourses =sprintf("SELECT * FROM VW_reg vwr WHERE vwr.sessionID=%s AND vwr.semesterID=%s",$sessionID,$semesterID); 
$rsRegcourses = mysql_query($query_rsRegcourses, $connChePortal) or die(mysql_error()); 
$row_rsRegcourses = mysql_fetch_assoc($rsRegcourses); 
$totalRows_rsRegcourses = mysql_num_rows($rsRegcourses); 
print_r($query_rsRegcourses); die; 

... 
?> 

我試圖運行查詢和我有以下的錯誤報告

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'AND vwr.semesterID=' at line 1 

感謝

+2

除了像其他人已經注意到的缺少單引號,你也沒有逃避數據之前,把它放入數據庫。你應該使用mysql_real_escape_string(或者更好的PDO,mysqli或ORM) – Greg

回答

0

我想你應該圍繞你的變量與單曲OTES ''請更改如下

"SELECT * FROM VW_reg vwr WHERE vwr.sessionID='%s' AND vwr.semesterID='%s'" 
+0

@Fabio ...感謝Dude它工作! – Jyd

+0

@jyd歡迎您 – Fabio

0

把% s這樣的單引號

"SELECT * FROM VW_reg vwr WHERE vwr.sessionID='%s' AND vwr.semesterID='%s'",$sessionID,$semesterID); 
+0

即使它們是數字? –

+0

我以爲%s在這裏用於字符串,所以答案就是在這種情況下。也是因爲這個錯誤。我從來沒有說過你應該總是這樣使用 –

+0

@chandresh_cool ...感謝mehn它確實有效。當使用字符串或數字時,請牢記這一點。 – Jyd

0

要插入變量插入查詢,你必須正確格式化
另外兩個答案包含不正確的格式 - 所以,你不應該遵循它們。

爲了使格式化更加得心應手,你必須封裝sprintf()成函數是這樣的:

function paraQuery() 
{ 
    $args = func_get_args(); 
    $query = array_shift($args); 
    $query = str_replace("%s","'%s'",$query); 

    foreach ($args as $key => $val) 
    { 
     $args[$key] = mysql_real_escape_string($val); 
    } 

    $query = vsprintf($query, $args); 
    $result = mysql_query($query); 
    if (!$result) 
    { 
     throw new Exception(mysql_error()." [$query]"); 
    } 
    return $result; 
} 

將適用正確的格式,也將處理錯誤

另外請注意,您的計數方式記錄是效率極低,可能會導致服務器掛起。你必須查詢你需要的唯一數據。所以,如果你只需要計算 - 要求只計數

因此,該代碼將

mysql_select_db($database_connChePortal, $connChePortal); 
$sql = "SELECT count(*) FROM VW_reg vwr WHERE vwr.sessionID=%s AND vwr.semesterID=%s"; 
$res = paraQuery($sql,$sessionID,$semesterID); 
$row = mysql_fetch_row($res); 
print_r($row[0]); die; 

它會使你的查詢正確的格式,從而無懈可擊的SQL注入

也,似乎那$semesterID沒有設置,這也可能會導致一些問題