我在使用PDO和PHP绑定值时遇到了一些问题。当我用变量替换值时,脚本会返回正确的结果,但由于某种原因,我无法使其工作。
// Connect to database in function on different page
function db1() {
try {
$pdo = new PDO("mysql:host=localhost;dbname=**********", '**********', '**********');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $pdo;
$pdo = null;
} catch (PDOException $e) {
die($e->getMessage());
}
}
// Scrit with problems
$db = db1();
$query = $db->prepare("SELECT column1, column2, column3, column4 FROM table_name WHERE (column4=2 OR column4=3) AND column5=:col1 AND column6=:col2"); // Prepare the statement to prevent any SQL injection
$query->bindValue(':col1', $var1, PDO::PARAM_INT);
$query->bindValue(':col2', $var2, PDO::PARAM_STR);
$query->execute();
// I also tried the following.
// $query->execute(array(':col1' => $var1, ':col2' => $var2));
// Fetch result row
$row = $query->fetch(PDO::FETCH_ASSOC);
有什么想法吗?
UPDATE 在查询之前和之后做了var_dump。 var1 = string(1)“2”和var2 = string(1)“1”
删除了$ pdo = null;
答案 0 :(得分:0)
除$pdo = null
之后的return
行,因此从未执行过,以及函数用作变量的$db = $db1()
,代码没有任何明显的错误。既然你说用变量替换绑定工作,我认为最后一个是拼写错误。
因此,我建议您尝试var_dump
脚本中$var1
和$var2
的值。{/ p>
<强>更新强>
我已经重复了这样的设置
<?php
$db = new PDO("mysql:host=localhost;dbname=test");
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$var1 = 1; // See answer text below
$var2 = 2;
$query = $db->prepare("SELECT * FROM test WHERE column5=:col1 AND column6=:col2");
$query->bindValue(':col1', $var1, PDO::PARAM_INT);
$query->bindValue(':col2', $var2, PDO::PARAM_STR);
$query->execute();
$row = $query->fetch(PDO::FETCH_ASSOC);
print_r($row);
?>
然后我创建了第一个这样的表
CREATE TABLE test ( column5 INTEGER, column6 INTEGER );
然后喜欢这个
CREATE TABLE test ( column5 varchar(5), column6 varchar(5) );
我尝试将$var1
和$var2
定义为1,2(整数)和“1”,“2”(字符串)。
它总是有效,即我希望得到一行作为输出,我做了:
Array
(
[column5] => 1
[column6] => 2
)
此时我认为剩下的唯一可能性是数据库内容中的一些奇怪的东西。
因此,我还希望系统上的测试不能正常工作,即不返回所需的行:
$query = $db->prepare("SELECT column1, column2, column3, column4 FROM table_name WHERE (column4=2 OR column4=3) AND column5=2 AND column6='1'");
$query->execute();
$row = $query->fetch(PDO::FETCH_ASSOC);
var_dump($row);