【问题标题】:Error: Call to a member function fetch() on array PDO not working错误:调用数组 PDO 上的成员函数 fetch() 不起作用
【发布时间】:2017-07-19 09:35:07
【问题描述】:

所以我已经看到了一些类似的问题,但没有一个解决方案对我有用,所以我问这个。

这是代码:-

                $sql = "SELECT sifra, IDartikli
                        FROM {$this->prefix}artikli
                        WHERE IDartikli = {$artikel_id};";
                 echo "$sql";
                $stmt = $this -> db -> execute($sql);
                print_r($stmt);
                $table = $stmt->fetch(PDO::FETCH_ASSOC
                //$table = $stmt;
                 // trenutne podatke vstavimo v tabelo artikli_stari
                $sql = "INSERT INTO {$this->prefix}artikli_stari
                        (EAN,
                        IDartikli)
                        VALUES('{$table['sifra']}',
                        '{$table['IDartikli']}');";
                $stmt = $this -> db ->prepare($sql);
                $stmt->execute();   

我在这里得到错误$table = $stmt->fetch(); 我在 phpmyadmin 中尝试了 sql,它在那里工作正常,函数 print_r($stmt); 让我得到了这个

Array
(
    [status] => OK
    [id] => 
    [count] => 
)

我不知道为什么它没有执行。 DB 类是必需的,适用于同一文件中的其他查询,如下所示 $row = $stmt->fetch(PDO::FETCH_ASSOC) 他们工作正常。我还尝试了PHP lint,它在我的代码中找不到错误。

【问题讨论】:

  • 您的代码容易受到 SQL 注入的影响,而且您似乎错过了准备好的语句的要点 - 顺便说一句,第一条语句 $stmt = $this -> db -> execute($sql); 不是 prepared ~ 它应该是吗?
  • 嗨。您找到解决方案了吗?
  • 我只是做了很长的路 $stmt = $database->connection->prepare($sql); $stmt->execute([':articleId' => $artikel_id]);

标签: php mysql pdo


【解决方案1】:

您误解了execute() 的工作原理:您需要准备一个语句,然后传递一个带有占位符值的数组作为参数。你没有传递一个 sql 字符串。

所以你的第一个查询应该是这样的:

$sql = "SELECT sifra, IDartikli
                    FROM {$this->prefix}artikli
                    WHERE IDartikli = :articleId;";
$stmt = $this->db->prepare($sql);
$stmt->execute([':articleId' => $artikel_id]);

如果您的表名来自未知来源,则应根据白名单检查表名,因为您无法准备表名。

【讨论】:

  • 实际上执行是我的数据库类中的一个函数,它执行此操作 $this -> stmt = $this -> connection -> prepare($sql);所以我确实准备了声明,但它在其他地方
  • @Noon 我们无法调试我们看不到的东西。而且你不需要准备任何东西,因为值是直接注入到查询中的。
【解决方案2】:
  • 函数execute() 获取语句标记的值 作为论据。请参阅:PDOStatement::execute
  • PDOStatement::execute 之前,您必须调用PDO::prepare,将sql 语句作为参数传递。
  • 始终使用标记将值传递给prepared statements
  • 永远不要在 sql 语句中使用分号 (;)。
  • 但是在每个 PHP 语句后使用分号($table = $stmt->fetch(PDO::FETCH_ASSOC 之后你忘记了):-)
  • 始终使用prepared statements together with exception handling(这是我今天发布的完整答案)。

祝你好运!

$sql = "SELECT sifra, IDartikli
        FROM {$this->prefix}artikli
        WHERE IDartikli = :artikel_id";
$stmt = $this->db->prepare($sql);
$stmt->execute(array(
    ':artikel_id' => $artikel_id,
));

$table = $stmt->fetch(PDO::FETCH_ASSOC);

$sifra = $table['sifra'];
$IDartikli = $table['IDartikli'];

$sql = "INSERT INTO {$this->prefix}artikli_stari (
            EAN,
            IDartikli
        ) VALUES (
            ':sifra',
            ':IDartikli'
        )";
$stmt = $this->db->prepare($sql);
$stmt->execute(array(
    ':sifra' => $sifra,
    ':IDartikli' => $IDartikli,
));
//...

【讨论】:

    猜你喜欢
    • 2016-03-25
    • 2011-10-16
    • 1970-01-01
    • 2013-10-01
    • 2017-06-18
    • 2019-04-19
    • 2011-03-21
    • 2012-08-21
    • 2016-09-11
    相关资源
    最近更新 更多