【问题标题】:PDOStatement object and MySQL user defined variablesPDOStatement 对象和 MySQL 用户定义的变量
【发布时间】:2015-01-29 08:42:11
【问题描述】:

我无法让这个使用 PDO 对象和带有用户定义变量的 MySQL 的脚本工作。我了解到使用 PDO 不能在一次调用中执行两个查询,因此我将其拆分为两个 query() 调用。但它仍然无法正常工作。这是我脚本的摘要(与 MySQL 的连接当然是在不同的文件中完成的,我在这里复制了它,所以为了这个问题,它都在一个地方):

 $db_hostname = 'localhost';
 $db_username = 'username';
 $db_password = 'pwd';
 $db_name = 'dbname';
 $dsn = "mysql:dbname=$db_name; host=$db_hostname";

 $pdo = new PDO($dsn, $db_username, $db_password);
 $strsql = "SET @num := 0, @tp := ''";

 $result=$pdo->query($strsql);

 $strsql = "SELECT " . $offer . "_tp AS tp, " . $offer . "_level AS best_offer, Price
           FROM (
                SELECT " . $offer . "_tp, " . $offer . "_level, Price, 
                    @num := if(@tp = `" . $offer . "_tp`, @num + 1, 1) as level,
                    @tp := `" . $offer . "_tp` as dummy
                FROM tbl_limit_offers
                WHERE Prod_Code = $procCode) as x               
           WHERE x.level = 1";
 $result = $pdo->query($strsql);
 echo $result->rowCount()

如果我直接在 PHPmyAdmin 中运行该查询,它会返回几条记录。但是,使用 PDO 对象运行它我得到:

致命错误:在非对象上调用成员函数 rowCount()

$result 应该是 PDOStatement 对象,rowCount() 应该是它的方法之一。那么,为什么它不起作用?

【问题讨论】:

  • 尝试做 var_dump($result) 会显示什么。
  • 试试:$result->fetchColumn() 这对你有用吗? (在你这样做之前,还要在你的 SQL 中添加COUNT(*)
  • @justrohu var_dump($result) 显示:boolean false
  • 似乎 PDOStatement 对象从未实例化。
  • @user2395238 是的,它看起来像......你能做 var_dump($pdo)

标签: php mysql pdo


【解决方案1】:
  • 你可以作为研究员做


    $setNumSql = "set @num = ?";
    $stmt = $con->preparedStatement($setNumSql );
    $stmt->executeQuery($num);

    $setTpSql = "set @tp = ?";
    $stmt = $con->preparedStatement($setTpSql);
    $stmt->executeQuery($tp);

    $exampleSql = "select * from tbl where NUM >= @num and TP = @tp";
    $stmt = $con->preparedStatement($exampleSql);
    $stmt->executeQuery();
    return $stmt->fetchAll();

  • 顺便说一句


    $sql = 'SELECT CONCAT(:offer_1, "_tp") AS tp, CONCAT(:offer_2, "_level") AS best_offer ...';

    $binds = array();
    $binds['offer_1'] = $offer;
    $binds['offer_2'] = $offer;

    $stmt = $con->preparedStatement($sql);
    $stmt->executeQuery($binds);

优于



    $sql = "SELECT " . $offer . "_tp AS tp, " . $offer . "_level AS best_offer ...";

【讨论】:

  • 如果不使用准备好的语句就不能这样做吗?我没有传递任何值。
  • 谢谢。问题,使用CONCAT 是因为它看起来更好还是因为它提高了查询的性能?
  • 所以,为了确认一下,使用 PDO 对象的用户定义变量的唯一方法是使用准备好的语句?
  • (2)它只是看起来更好。
  • (1) $offer 不是你传递给sql语句的值?
【解决方案2】:

我发现我的代码出了什么问题。它是 PDO 对象。设置时,dsn 不能有空格。在我删除 $dsn 变量中的空格后,一切都按预期工作。 原$dsn变量(不工作):

 $dsn = "mysql:dbname=$db_name; host=$db_hostname";

正确方式(分号后无空格):

 $dsn = "mysql:dbname=$db_name;host=$db_hostname";

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    • 2011-11-05
    相关资源
    最近更新 更多