2017-07-19 89 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, 
)); 
//... 
相關問題