在PHP中绑定PDO查询时出错

时间:2012-10-11 18:05:32

标签: php mysql pdo

我在使用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;

1 个答案:

答案 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);