2013-04-26 57 views
-2

所以,我有兩個功能:差異是PHP SQL返回

function display_name1($s){ 
     global $db; 
     $query1 = "SELECT Taken From Alcohol where P_Key = $s"; 
     $r = $db->prepare($query1); 
     $r->execute(); 
     $result = $r->fetchColumn(); 
     return $result; 

} 

    function write_Recipe($s){ 
     global $db; 
     $query1 = "SELECT Taken From Alcohol where Name = $s"; 
     $r = $db->prepare($query1); 
     $r->execute(); 
     $result = $r->fetchColumn(); 
     return $result; 

    } 

唯一的區別是,我在第一個例子匹配輸入「$ s」用「p_key的值」和「名」在後者。當我爲第一個功能輸入數字時,我會得到相應的回報。當我輸入一個至少匹配一個「姓名」的字符串時,我什麼也收不回來。由於某種原因,它似乎不符合字符串。有任何想法嗎?

+1

您還在第二個查詢中缺少表名 – Phil 2013-04-26 01:25:50

+0

這很奇怪,表名存在於我當前的代碼中。我不知道它是如何沒有進入上面的代碼。 – 2013-04-26 03:30:35

回答

5

有一個在SQL查詢語法錯誤。您在第二個查詢丟失的表名:

"SELECT Taken From where Name = '$s'" 

應該是這樣的:

"SELECT Taken FROM `tablename` WHERE `Name` = '$s'" 

另外請注意,如果您已經使用準備好的語句,你應該綁定變量的查詢而不是使用字符串連接構建查詢。另外使用global對於OOP設計並不完美。這裏談到一個例子怎麼能做得更好:

// extend a class from PDO 
class CustomPDO extends PDO { 


    public function display_name($s){ 

     // use placeholder :p_key in query 
     $query1 = "SELECT Taken FROM `Alcohol` WHERE `P_Key` = :p_key"; 
     $r = $this->prepare($query1); 

     // bind value to prepared statement 
     $r->execute(array(
      ':p_key' => $s 
     )); 
     $result = $r->fetchColumn(); 
     return $result; 
    } 

    public function write_recipe($s){ 

     // use placeholder :name in query 
     $query1 = "SELECT Taken FROM `tablename` WHERE `Name` = :name"; 

     // use $this as we are extended from PDO 
     $r = $this->prepare($query1); 

     // bind value to prepared statement 
     $r->execute(array(
      ':name' => $s 
     )); 

     $result = $r->fetchColumn(); 
     return $result; 
    } 
} 

然後使用這個類像一個普通的PDO對象:

$db = new CustomPDO($connection_string, $user, $password); 

但有兩個方法:

$result = $db->display_name('foo'); 
$result = $db->write_recipe('foo'); 
+0

爲什麼downvote?..請留下評論!! – hek2mgl 2013-04-26 01:30:10

+0

將值連接到SQL查詢字符串中僅僅是錯誤的 – Phil 2013-04-26 01:34:11

+0

您是否瘋狂地因此而沮喪?是的,我不會這樣做。但它不是*錯誤*。發出帶語法錯誤的查詢*錯誤* – hek2mgl 2013-04-26 01:35:38

2

當對字符串查詢,你應該圍繞一個變量加上引號,像這樣:

"SELECT Taken From where Name = '$s'"

而且你的第二個查詢缺少一個表名。

"SELECT Taken From表名where Name = '$s'"

+1

+1打我一分鐘。 :) – hek2mgl 2013-04-26 01:57:43

+0

這實際上並沒有爲我工作,但當我在上面的答案(你打了一分鐘)的「名稱」的引號中添加它的工作完美。 – 2013-04-26 03:38:10

1

字符串需要被引用(如果你還沒有的話可能會逃脫)。您似乎在使用PDO,爲什麼不添加佔位符?取而代之的是執行execute(array($s));,讓PDO爲你做好工作?

function display_name1($s){ 
    global $db; 
    $query1 = "SELECT Taken From Alcohol where P_Key = ?"; 
    $r = $db->prepare($query1); 
    $r->execute(array($s)); 
    $result = $r->fetchColumn(); 
    return $result; 
} 

function write_Recipe($s){ 
    global $db; 
    $query1 = "SELECT Taken From Alcohol where Name = ?"; 
    $r = $db->prepare($query1); 
    $r->execute(array($s)); 
    $result = $r->fetchColumn(); 
    return $result; 

} 
+1

在清理代碼時,爲什麼不將'PDO'對象作爲函數參數傳遞而不是使用全局變量? – Phil 2013-04-26 01:27:19

+0

因爲我不知道'$ db'對象是否在函數調用點P的範圍內(但是,你有一點關於它的更好)。 – Wrikken 2013-04-26 01:28:46

+0

這將在範圍內,如果傳遞給函數 – Phil 2013-04-26 01:29:09