2013-04-26 106 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