我有点困惑,因为当我尝试下面的代码时,我会收到所需的结果。
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'];
答案 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,
));