错误:调用阵列PDO上的成员函数fetch()不起作用

时间:2017-07-19 09:35:07

标签: php mysql pdo

所以我看到退出了几个类似的问题,但没有一个解决方案适合我,所以我问这个。

这是代码: -

                $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,它在我的代码中找不到错误。

2 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:0)

  • 函数- (void)viewDidLoad { [super viewDidLoad]; [self.navigationController setToolbarHidden:NO]; UIBarButtonItem* spaceItem1 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil]; ... create other items ... self.toolbarItems = @[ item1, spaceItem1, item2, spaceItem2, ... ]; ... } 获取语句标记的值 作为参数。请参阅:PDOStatement::execute
  • execute()之前,您必须调用PDOStatement::execute,并将sql语句作为参数传递。
  • 始终使用标记将值传递给prepared statements
  • 不要使用分号(;)作为sql语句的一部分。
  • 但是在每个PHP语句之后使用分号(在PDO::prepare之后忘记了它): - )
  • 始终使用prepared statements together with exception handling(这是我今天发布的完整答案)。
祝你好运!

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