2017-07-19 7 views
-1

私はいくつか似たような質問をしましたが、それらの解決策のどれも私のために働かなかったので、私はこれを求めています。エラー:配列PDOのメンバー関数fetch()を呼び出しても機能しません

これはコードです: -

   $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を試してみました。

+0

あなたのコードはSQLインジェクションの影響を受けやすく、プリペアドステートメントのポイントが欠落しているように見えます.-言い換えれば、最初のステートメント '$ stmt = $ this-> db-> execute($ sql);は'準備されていた〜だったはずだった? – RamRaider

+0

こんにちは。あなたはあなたの解決策を見つけましたか? –

+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, 
)); 
//... 
関連する問題