【问题标题】:PDOStatement::bindParam && PDOStatement::bindValue not workingPDOStatement::bindParam && PDOStatement::bindValue 不起作用
【发布时间】:2013-07-25 11:39:20
【问题描述】:

我在 StackOverFlow 上阅读了很多帖子,并在 php dot net 上阅读了文档信息。

这是我正在尝试的代码:

示例 1

$id = 1;
$sth = $this->pdo->prepare('SELECT * FROM USERS_TABLE WHERE ID_USR = ?');
$sth->execute(array(intval($id)));

示例 2

$id = 1;
$sth = $this->pdo->prepare('SELECT * FROM USERS_TABLE WHERE ID_USR = :id');
$sth->bindParam(':id', $id, PDO::PARAM_INT);
$sth->execute();

示例 3

$id = 1;
$sth = $this->pdo->prepare('SELECT * FROM USERS_TABLE WHERE ID_USR = :id');
$sth->bindValue(':id', intval($id));
$sth->execute();

如果我试试这个:

$sth = $this->pdo->prepare('SELECT * FROM USERS_TABLE WHERE ID_USR = 1');
$sth->execute();

我得到了我期望的结果,但这不是我正在寻找的解决方案。

希望你能帮助我,在此先感谢。

//////////编辑1

在所有这些示例的最后,我这样做:

$arr = $sth->errorInfo();
print_r($arr);

返回是:

数组([0] => 00000 [1] => [2] =>)

//////////编辑2

这是代码

class User {

    private $registry;
    private $userId;
    private $userLan;
    private $fullName;
    private $dob;
    private $email;
    private $sex;
    private $nationality;
    private $valid; // User valid?
    private $pdo; // PDO reference

    /**
     * Constructor del usuario. Se puede construir de dos formas, pasando email y password o pasando una id de usuario.
     * @param Registry $registry.
     * @param Int $id
     * @param String $email
     * @param String $password
     * @param String $username
     * @return void
     */
    public function __construct ( Registry $registry, $id, $email, $password, $username)
    {
            echo "constructor user with id = $id ";
            $this->valid = false;
        $this->registry = $registry;
        if($id = 0 && $username != '' && $password != '')
        {
                    // ...
                    $this->valid = true;
        }
        //else if($id > 0)
            else
        {
            // $id = intval($id);
                echo "second if";
                $this->pdo = $registry->getObject('db')->getPdo();
                try
                {
                    $sth = $this->pdo->prepare('SELECT * FROM USERS_TABLE WHERE ID_USR = :id');
                    $sth->execute(array(':id' => intval($id)));
                    //$sth->execute(array(intval($id)));
                    $arr = $sth->errorInfo();
                    print_r($arr);
                    $result = $sth->fetch(PDO::FETCH_BOTH);
                    print_r($result);
                }
                catch(PDOException $e)
                {
                    echo $e->getMessage();
                }
                echo "passing query";
                if($sth->rowCount() ==1)
                    echo "yeeeha";
                else
                    echo "not yeeha (".$sth->rowCount().") ";
                    // ...
                    $this->valid = true;
        }
    }

【问题讨论】:

  • 到底出了什么问题?
  • 你为什么要做$sth->errorInfo();?干什么用的?
  • 虽然很难相信所有这些语句都不起作用而最后一个语句起作用
  • 别问我。程序员应该询问他们的代码。要么存在错误(必须显示),要么代码有效。就如此容易。你读过我提供的链接吗?

标签: php mysql pdo


【解决方案1】:

您的错误检查看起来不正确:

$sth = $this->pdo->prepare('SELECT * FROM USERS_TABLE WHERE ID_USR = :id');
$sth->bindParam(':id', $id, PDO::PARAM_INT);
$sth->execute();
$arr = $sth->errorInfo();

这假设PDO::prepare() 总是返回一个对象,但这不是documentation 所说的:

返回值

如果数据库服务器成功准备语句, PDO::prepare() 返回一个 PDOStatement 对象。 如果数据库服务器 无法成功准备语句,PDO::prepare() 返回 FALSE 或发出 PDOException(取决于错误处理)。

我建议你让你的生活更轻松,并将 PDO 配置为抛出异常。本例取自from the manual

$dbh = new PDO($dsn, $user, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                                      ^^^^^^^^^^^^^^^^^^^^^^

【讨论】:

  • 谢谢,实际上已修复它(@YourCommonSense 为我提供了另一个解决方案)+1 /// 无论如何代码不会抛出异常。
  • 嗯,这就是“不工作”作为唯一解释的问题:任何答案都只是盲目的。
【解决方案2】:

我不想猜测,但我能找到的唯一合理解释是 $id 和缺少错误报告

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-11
    • 2019-03-19
    • 2015-01-22
    • 2010-09-23
    • 2015-06-23
    • 1970-01-01
    • 2011-04-27
    • 2010-11-29
    相关资源
    最近更新 更多