我正在尝试在PDO中创建可重用的代码。
这是我的代码。
$myClass = new main_c();
$condition = "email_address = :email_address AND password = :password";
$array = array('email_address' => 'yiihii@yahoo.com', 'password' => '98467a817e2ff8c8377c1bf085da7138');
$row = $myClass->get('user', $condition, $array, $db);
print_r($row);
这是我的功能。
public function get($tablename, $condition, $array, $db){
$stmt = $db->prepare("SELECT * FROM $tablename WHERE $condition");
foreach($array as $k=>$v){
$stmt->bindParam(":$k", $v);
}
try{
$stmt->execute();
}catch(PDOException $e){
$error = new main_c();
echo $error->error_handling($e);
}
return $row=$stmt->fetch(PDO::FETCH_ASSOC);
}
我尝试在条件中省略AND
并且只放了一个where子句并且它有效。我认为foreach存在问题。我不确定。
答案 0 :(得分:2)
您不是绑定值,而是参数,因此在循环中,您只将一个变量$v
绑定到键$k
。两次。当您执行查询时,这些变量将包含循环的最后一次迭代的值。
您需要将bindParam()
更改为bindValue()
。
但是,由于您没有使用bindParam()
/ bindValue()
的第三个参数 - 强制数据类型 - 您可以跳过整个循环并执行:
try {
$stmt = $db->prepare("SELECT * FROM $tablename WHERE $condition");
$stmt->execute($array);
...