PHP PDO DB函数返回1而不是请求的值
我有点困惑,因为当尝试下面的代码时,我收到了期望的结果PHP PDO DB函数返回1而不是请求的值,php,mysql,pdo,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))
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'];
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'];
但是,当我运行下面的代码时,它返回1而不是期望的结果
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'];
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'];
函数中的查询有错误:
$inv = $db->dbh->prepare("SELECT * FROM ruj_users WHERE :whr");
function fetchUser($column, $value) {
应该是:
$inv = $db->dbh->prepare("SELECT * FROM ruj_users WHERE email=:whr");
编辑:如果还想传递列名,则必须向函数中添加另一个变量:
$inv = $db->dbh->prepare("SELECT * FROM ruj_users WHERE :whr");
function fetchUser($column, $value) {
请注意,只有值可以绑定到准备好的语句中,您必须对照白名单检查列变量,以避免sql注入和查询中的硬代码,如。。。其中$column=:whr…
此查询:
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,
));
我刚刚编辑了代码以反映这个$row=fetchUser(“email=”“$whr.”);我又收到了1。你只能绑定变量,不能绑定像
a=b
这样的语句。你只能绑定变量而不能绑定语句的原因是绑定变量的关键在于你编译了SQL语句,而它只缺少值。语句的可执行部分不会更改。这既是一个性能优势,因为DB不必每次都重新编译语句,也是一个安全漏洞,因为无论数据有多脏,它不会修改要执行的代码。如何修改代码,以便始终可以将变量传递到函数中以返回列结果?@ClaudeGrecea添加了一个如何添加额外条件的示例。感谢您的快速回复!因为我现在有两个条件,我想用“and”来分隔它们,比如$column=?和$column=。我将如何在现有的代码中实现这一点?我是使用内爆还是在某处添加sql.=
?你能给我举个例子吗?我改成了$row=fetchUser(“email=”“$whr.”);它仍然返回1。另外,我尝试了你的答案,也返回了1。@Claude Grecea在你的问题下面看到了我的评论。不确定,但我认为我们误解了OP的目的;他们想通过一个函数参数来指定WHERE条件。是的,好像有人进来,对这个问题投了否决票,所有答案=p