PHP PDO DB函数返回1而不是请求的值

时间:2012-12-11 23:49:40

标签: php mysql pdo

我有点困惑,因为当我尝试下面的代码时,我会收到所需的结果。

   include_once('config.class.php');
   $db = Core::getInstance();     
   $whr = 'test@nannex.com';

  $inv = $db->dbh->prepare("SELECT * FROM ruj_users WHERE email=:whr");
  $inv->execute(array(":whr"=>$whr));
  $row = $inv->fetch(PDO::FETCH_ASSOC);
    echo $row['email'];
    echo $row['full_name'];

但是,当我运行以下代码时,它返回1而不是所需的结果。

     include_once('config.class.php');
     $db = Core::getInstance();     
     $whr = 'test@nannex.com';    

     function fetchUser($whr){  
    $db = Core::getInstance();              
    $inv = $db->dbh->prepare("SELECT * FROM ruj_users WHERE :whr");
            $inv->execute(array(':whr'=>$whr)); 
    $res = $inv->fetch(PDO::FETCH_ASSOC);
    return $res;
}
    $row = fetchUser("email = '".$whr."' "); 
    echo $row['email'];
    echo $row['full_name'];

2 个答案:

答案 0 :(得分:1)

您在查询函数中遇到错误:

$inv = $db->dbh->prepare("SELECT * FROM ruj_users WHERE :whr");

应该是:

$inv = $db->dbh->prepare("SELECT * FROM ruj_users WHERE email=:whr");

编辑:如果您还要传递列名,则必须在函数中添加另一个变量:

function fetchUser($column, $value) {

请注意,只有值可以绑定在预准备语句中,您必须根据白名单检查列变量,以避免在查询中使用sql注入和硬编码,例如... WHERE $column = :whr ...

答案 1 :(得分:1)

此查询:

SELECT * FROM ruj_users WHERE :whr

展开时:

SELECT * FROM ruj_users WHERE 'email = \'test@nannex.com\''

表达式email = \'test@nannex.com\'将由MySQL作为布尔值进行评估,并且始终是真实的,因此它将返回ruj_users中的所有行。

如果您想要自定义条件,可以执行以下操作:

function fetchUser(array $conditions)
{
    // ...
    $sql = 'SELECT * FORM ruj_users WHERE';
    $params = array();
    foreach ($conditions as $column => $value) {
        if (preg_match('/^[a-z]+$/', $column)) {
            $sql .= "`$column` = ?";
            $params[] = $value;
        }
    }
    $inv = $db->dbh->prepare($sql);
    $inv->execute(array_values($params));
    // ...
}

fetchUser(array(
    'email' => 'test@nannex.com',
    'status' => 23,
));
相关问题