php
  • mysql
  • select
  • 2011-11-18 99 views 0 likes 
    0
    mysql_query("SELECT * FROM foo WHERE id ='$foo' OR id = '$foo2"); 
    

    這是行不通的。PHP mysql選擇QUERY與或

    基本上,我希望能夠選擇它,其中id是一個變量的值或另一個的值。

    謝謝。

    編輯:ID列是數字。

    +0

    是ID列的數字? – ManseUK

    +0

    在代碼中缺少''''。只是一個錯字? – Kakashi

    +2

    _「這不起作用。」_是否是從MySql獲得的錯誤?爲什麼給定的查詢不起作用,我認爲它有點冗長,但我可能會誤解。 – CodeCaster

    回答

    3

    正如其他人所說,你確認,問題是,您正在使用字符串文字來比較數字列。有它的工作,查詢應該像

    mysql_query("SELECT * FROM foo WHERE id =$foo OR id = $foo2"); 
    

    然而,這種解決方案具有非常非常壞的代碼味道!

    首先,這是爲什麼IN存在:要能寫

    mysql_query("SELECT * FROM foo WHERE id IN ($foo, $foo2)"); 
    

    第二,你注入轉義串到你的查詢?如果你是,你的代碼容易受到sql injection的影響!你知道我們是在談論整數值這種特定情況下

    $query = sprintf("SELECT * FROM foo WHERE id IN ('%s', '%s')", 
           mysql_real_escape_string($foo), 
           mysql_real_escape_string($foo2)); 
    mysql_query($query); 
    

    或交替這樣的,因爲:

    逃生和報價您的變量是安全的,這樣(一般情況下)
    $query = sprintf("SELECT * FROM foo WHERE id IN (%s, %s)", 
           intval($foo), intval($foo2)); 
    mysql_query($query); 
    

    腳註:據我所知,使用sprintf這樣的時候,人們還可以處理整數值,只要使用%d代替如果%s的格式說明。然而,我相信只要看一個地方(參數列表)而不是多個地方(我在變量上使用intval?或者我沒有使用,但我正在使用%d在格式字符串中,所以我仍然可以嗎?)。這聽起來可能與直覺相反,但在面對修改時它更強大。

    +0

    你是rigth。我編輯 – Kakashi

    +0

    @Kakashi:如果'$ foo'和/或'$ foo2'是惡意的,你的編輯對sql注入是開放的。 – Jon

    +0

    你的第三個代碼片段容易受到sql注入的影響 –

    3

    我想你忘記了過去的「字符

    mysql_query("SELECT * FROM foo WHERE id ='$foo' OR id = '$foo2'"); 
    

    但因爲id列是數值,你應該使用:

    mysql_query("SELECT * FROM foo WHERE id = $foo OR id = $foo2"); 
    
    0

    試試這個:

    mysql_query(sprintf("SELECT * FROM foo WHERE id = %s OR id = %s", $foo, $foo2)); 
    

    我建議你使用mysql_error()來獲得MySQL錯誤(如果存在)。

    mysql_query(..) or die('Erro:'.mysql_error()); 
    

    mysql_error返回mysql中發生的最後一個錯誤。

    相關問題