2017-07-19 69 views
-1

所以我已经看到退出一些类似的问题,但没有解决方案为他们工作,所以我问这个。错误:调用成员函数获取()数组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] => 
) 

我不知道为什么它不执行。数据库类是必需的,适用于同一文件中的其他查询,如 $row = $stmt->fetch(PDO::FETCH_ASSOC),它们可以正常工作。我也试过PHP lint,在我的代码中找不到错误。

+0

你的代码容易受到SQL注入的影响,你似乎缺少准备好的语句 - 顺便说一下第一条语句'$ stmt = $ this - > db - > execute($ sql);'不是'准备好了〜它应该是? – RamRaider

+0

嗨。你找到你的解决方案吗? – 2017-07-20 08:06:57

+0

我只是做了很长的路要走 $ stmt = $ database-> connection-> prepare($ sql); $ stmt-> execute([':articleId'=> $ artikel_id]); – Noon

回答

3

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

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

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

而且你的表名应该与白名单,如果它来自一个未知的来源,你不能准备一个表名进行检查。

+0

其实执行是我的DB类中的一个函数,它是这样做的 $ this - > stmt = $ this - > connection - > prepare($ sql); 所以我做准备的声明,但它在别处 – Noon

+0

@Noon我们不能调试我们看不到的东西。而且你不准备任何东西,因为这些值直接在查询中注入。 – jeroen

0
  • 函数​​将语句标记 的值作为参数。参见: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, 
)); 
//... 
相关问题