【问题标题】:Catchable fatal error: Object of class PDOStatement could not be converted to string in line 114可捕获的致命错误:无法将 PDOStatement 类的对象转换为第 114 行中的字符串
【发布时间】:2014-01-30 18:04:04
【问题描述】:

我正在尝试将一些数据添加到我的数据库中,但我收到错误 Catchable fatal error: Object of class PDOStatement could not be convert to string in /var/www/mandje.php on line 114。 这是我正在使用的代码:

 foreach($_SESSION["cart"] as $id => $value){

        $query = $db->query('SELECT * FROM Producten WHERE ProductID ="'.$id.'" ');
        $query->execute();

        while($row = $query->fetch(PDO::FETCH_ASSOC)){
            $price = $row['Prijs'];
            $ProductID = $row['ProductID'];
            }
        $sql="INSERT INTO Bestellingsdetail( Bestelnummer, ProductID, Aantal, Prijs)
        VALUES ($max,$ProductID,$value,$price)";      //<---- line 114
        $count = $db->execute($sql);

我真的不明白这里出了什么问题。任何帮助将不胜感激:)

【问题讨论】:

  • 如果你做var_dump($max,$ProductID,$value,$price);会看到什么?
  • 我得到:object(PDOStatement)#3 (1) { ["queryString"]=> string(49) "SELECT MAX( Bestelnummer ) FROM Bestellingsdetail" } string(2) "17" int (2) 字符串(5) "29.98"
  • 有问题。 $max 是什么?你在哪里设置的?
  • 我做了几行: if(isset($_POST["koop"])) { $query = $db->query('SELECT MAX( Bestelnummer ) FROM Bestellingsdetail'); $查询->执行(); $max = $查询; $max ++;
  • $max = $query。为什么将$max 设置为$query?我假设您想将其设置为查询的 result

标签: php pdo


【解决方案1】:

在 cmets 中,您显示以下内容:

$query = $db->query('SELECT MAX( Bestelnummer ) FROM Bestellingsdetail');
$query->execute();
$max = $query;
$max++;

这不是您从查询中获得结果的方式。您正在将 $max 设置为 PDOStatement 对象。您需要fetch() 才能使用结果。

// I've added "AS maxval" to make it easier to get the row
$query = $db->query('SELECT MAX(Bestelnummer) AS maxval FROM Bestellingsdetail');
$max_row = $query->fetch(PDO::FETCH_ASSOC);

$max = $max_row['maxval'];
$max++;

文档:http://www.php.net/pdo.query

附: $query-&gt;execute(); 仅用于准备好的语句。 query() 将立即执行查询。

【讨论】:

  • 是的,你拯救了我的一天!
【解决方案2】:
foreach($_SESSION["cart"] as $id => $value)
{

        $query = $db->query('SELECT * FROM Producten WHERE ProductID ="'.$id.'" ');
        $query->execute();

        while($row = $query->fetch(PDO::FETCH_ASSOC))
        {

            $price = $row['Prijs'];
            $ProductID = $row['ProductID'];

        }

$array = array( $max, $ProductID, $value, $price );

$sql->prepare
    ("
    INSERT INTO Bestellingsdetail (Bestelnummer, ProductID, Aantal, Prijs)
    VALUES (?, ?, ?, ?)
    ")

$sql->execute($array);

}

【讨论】:

    【解决方案3】:

    试试:

    foreach($_SESSION["cart"] as $id => $value){
    
            $query = $db->query('SELECT * FROM `Producten` WHERE ProductID ="'.$id.'" ');
            $query->execute();
    
            while($row = $query->fetch(PDO::FETCH_ASSOC)){
                $price = $row['Prijs'];
                $ProductID = $row['ProductID'];
                }
            $sql="INSERT INTO `Bestellingsdetail`( `Bestelnummer`, `ProductID`, `Aantal`, `Prij`s)
            VALUES ($max,$ProductID,$value,$price)";
            $smtp = $db->prepare($sql);
            $count = $smtp->execute();
    

    但是,请尝试使用准备好的语句,因为您正在击败使用 PDO 的原因并且可能存在注入风险:

    foreach($_SESSION["cart"] as $id => $value){
    
            $query = $db->query('SELECT * FROM `Producten` WHERE ProductID ="'.$id.'" ');
            $query->execute();
    
            while($row = $query->fetch(PDO::FETCH_ASSOC)){
                $price = $row['Prijs'];
                $ProductID = $row['ProductID'];
                }
            $sql="INSERT INTO `Bestellingsdetail`( `Bestelnummer`, `ProductID`, `Aantal`, `Prijs`)
            VALUES (:max,:ProductID,:value,:price)";
            $stmt = $db->prepare($sql);
            $stmt->bindParam(':max', $max);
            $stmt->bindParam(':ProductID', $ProductID);
            $stmt->bindParam(':value', $value);
            $stmt->bindParam(':price', $price);
            $count = $smtp->execute();
    

    【讨论】:

    • 我尝试了第二种方法并得到:致命错误:在第 115 行的 /var/www/mandje.php 中的非对象上调用成员函数 bindParam() 第 115 行是 $stmt- >bindParam(':max', $max);
    • @DeEerlijkeDame 抱歉尝试一下,其中一些命名不正确,并且在我们将对象设置为变量之前还使用了 bindParam
    • 现在我再次遇到第一个错误:可捕获的致命错误:无法将 PDOStatement 类的对象转换为第 116 行 /var/www/mandje.php 中的字符串
    • 抱歉最后一行应该是 $count = $stmt->execute();
    • 还是同样的错误:可捕获的致命错误:无法将 PDOStatement 类的对象转换为第 116 行 /var/www/mandje.php 中的字符串
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 2017-04-20
    • 2015-03-08
    • 2013-08-07
    相关资源
    最近更新 更多