2012-02-17 20 views
0

こんにちは私はここを見回しましたが、答えが見つからないようです。PHP Mysql PDOのバインドされた変数の数がトークンの数と一致しません

私はPDOを初めて使用したので、初心者でもあります。

私は2つのテーブルに分割されたデータを1つにマージしたいのですが、これを行うには他の方法がありますが、複雑な理由はありません。 。

は、私は私がループ

に私の文

実行それを構築

からデータをコピーするテーブルのレコードセットを生成するが、私は次のエラーを取得する

SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens 

Iveは変数を同じにしているので、「トークンはわかりません」と言っているように、これは非常に新しいので、おそらくプロが明白であると考えているものがありません。

  • HERESに私のコードそれは私がテーブル内のすべての単一の列に追加しておりません、他の列があることをおそらく言及する価値がありますが、私は準備文のうち、それらを残した... :

    //$dbh = new PDO($hostname_Seriously, $DB_USER, $DB_PASSWORD); 
    $dbh = new PDO('mysql:host=localhost;dbname=seriouslysoulful_summers', $username_Seriously, $password_Seriously); 
    $stmt = $dbh->prepare("INSERT INTO records_rec (oldid_rec, firstname_rec, artist_rec, aside_rec, bside_rec, label_rec, condition_rec, genere_rec, price_rec, collection_rec, active_rec, info_rec, notes_rec, order_rec, alabelimage_rec, blabelimage_rec, asound_rec, bsound_rec, featured_rec, format_rec) 
    VALUES (:oldid_rec, :firstname_rec, :artist_rec, :aside_rec, :bside_rec, :label_rec, :condition_rec, :genere_rec, :price_rec, :collection_rec, :active_rec, :info_rec, :notes_rec, :order_rec, :alabelimage_rec, :blabelimage_rec, asound_rec, bsound_rec, :featured_rec, :format_rec)"); 
    $stmt->bindParam(':oldid_rec', $id); 
    $stmt->bindParam(':firstname_rec', $firstname); 
    $stmt->bindParam(':artist_rec', $artist); 
    $stmt->bindParam(':aside_rec',$aside); 
    $stmt->bindParam(':bside_rec',$bside); 
    $stmt->bindParam(':label_rec',$label); 
    $stmt->bindParam(':condition_rec',$condition); 
    $stmt->bindParam(':genere_rec',$genere); 
    $stmt->bindParam(':price_rec',$price); 
    $stmt->bindParam(':collection_rec',$collection); 
    $stmt->bindParam(':active_rec',$active); 
    $stmt->bindParam(':info_rec',$info); 
    $stmt->bindParam(':notes_rec',$notes); 
    $stmt->bindParam(':order_rec',$order); 
    $stmt->bindParam(':alabelimage_rec',$alabel); 
    $stmt->bindParam(':blabelimage_rec',$blabel); 
    $stmt->bindParam(':asound_rec',$asound); 
    $stmt->bindParam(':bsound_rec',$bsound); 
    $stmt->bindParam(':featured_rec',$featured); 
    $stmt->bindParam(':format_rec',$format); 
    $reccount = 0; 
    //do{ 
    $id = $row_rs_original['id_prod']; 
    $firstname = 
    mysql_real_escape_string($row_rs_original['firstname_prod']); 
    $artist = mysql_real_escape_string($row_rs_original['artist_prod']); 
    $aside = mysql_real_escape_string($row_rs_original['a_side_prod']); 
    $bside = mysql_real_escape_string($row_rs_original['b_side_prod']); 
    $label = mysql_real_escape_string($row_rs_original['label_prod']); 
    $condition = mysql_real_escape_string($row_rs_original['condition_prod']); 
    $genere = $row_rs_original['genre_prod']; 
    $price = $row_rs_original['price_prod']; 
    $collection = mysql_real_escape_string($row_rs_original['collection_prod']); 
    $active = $row_rs_original['active_prod']; 
    $info = mysql_real_escape_string($row_rs_original['info_prod']); 
    $notes = mysql_real_escape_string($row_rs_original['notes_prod']); 
    $order = $row_rs_original['order_prod']; 
    $alabel = mysql_real_escape_string($row_rs_original['labelimage_A_prod']); 
    $blabel = mysql_real_escape_string($row_rs_original['labelimage_B_prod']); 
    $asound = mysql_real_escape_string($row_rs_original['soundfile_A_prod']); 
    $bsound = mysql_real_escape_string($row_rs_original['soundfile_B_prod']); 
    $featured = $row_rs_original['featured_prod']; 
    $format = $row_rs_original['format_prod']; 
    
    $stmt->execute(); 
    
        $reccount = $reccount +1; 
    //} while ($row_rs_original = mysql_fetch_assoc($rs_original)); 
    echo($reccount." - records added..."); 
    
    マーク・ベイカーは、すでにあなたの探求に答えのよう

答えて

11

行方不明コロン

:blabelimage_rec, **:**asound_rec, **:**bsound_rec, :featured_rec, :format_rec 
16

が見えます私は多くの助けになった2つのヒントを加えたいと思っていました。すべてが準備されたステートメント(あなたが上記されているように)あなたがmysql_real_escape_stringで入力をエスケープする必要はありませんを使用しているユーザー入力を扱うクエリに入るよう

PDOは限りmysql_escape_string
を必要としません[ 1]。

// Don't worry about SQL injection since all of the user 
// defined inputs are being escaped by the PDO package 
$sql = "INSERT INTO " 
    . "`users` " 
    . "SET " 
    . "`name` = :name"; 

$query = $pdo->prepare($sql); 
$query->bindParam(':name', $name); 
$query->execute(); 

しかし、あなたは、ユーザーの入力を結合していない場合は、SQLインジェクションがまだ可能であることに注意してください:

// SQL injection can totally happen here 
$sql = "INSERT INTO " 
    . "`users` " 
    . "SET " 
    . "`name` = $name"; 

$query = $pdo->prepare($sql); 
$query->execute(); 

[1] http://www.php.net/manual/en/pdo.prepared-statements.php




てみてくださいSQLを可能な限り短くする方法
単純なSQLステートメントの場合、SQLステートメントが短いほど、保守が簡単になり、間違いを起こす可能性は低くなります。あなたはその大きそうしないので効果的半分することができ、あなたのような大きな文ための手段

INSERT INTO 
    `users` 
    (
    `name` 
) 
    VALUES 
    (
    'Steve' 
); 

INSERT INTO 
    `users` 
SET 
    `name` = 'Steve'; 

は同等です:あなたは、代替INSERT構文[2]を使用することができます

$sql = "INSERT INTO " 
     . "`records_rec` " 
     . "SET " 
     . "`oldid_rec`  = :oldid_rec, " 
     . "`firstname_rec` = :firstname_rec, " 
     . "`artist_rec`  = :artist_rec, " 
     . "`aside_rec`  = :aside_rec, " 
     . "`bside_rec`  = :bside_rec, " 
     . "`label_rec`  = :label_rec, " 
     . "`condition_rec` = :condition_rec, " 
     . "`genere_rec`  = :genere_rec, " 
     . "`price_rec`  = :price_rec, " 
     . "`collection_rec` = :collection_rec, " 
     . "`active_rec`  = :active_rec, " 
     . "`info_rec`  = :info_rec, " 
     . "`notes_rec`  = :notes_rec, " 
     . "`order_rec`  = :order_rec, " 
     . "`alabelimage_rec` = :alabelimage_rec, " 
     . "`blabelimage_rec` = :blabelimage_rec, " 
     . "`asound_rec`  = :asound_rec, " 
     . "`bsound_rec`  = :bsound_rec, " 
     . "`featured_rec` = :featured_rec, " 
     . "`format_rec`  = :format_rec"; 

$dbh = new PDO(<info goes here>); 
$stmt = $dbh->prepare($sql); 

// Bind your params here... 

[2] http://dev.mysql.com/doc/refman/5.5/en/insert.html

:列名のすべてを繰り返す必要があります




Iは、(上記のように)複数行であることを私のSQL文をフォーマット開始し、私はこのようなWAY少ないエラーを持っていた以来

あなたのSQL文マルチラインを作成していますし、かなり 。それはが多くの部屋を占めるのですが、結局それに値すると思います。すべてを整列させることで、痛みのように間違いが起きます。

ハッピーコーディング!

+0

私は十分にこれをupvoteできません! – Mawg

関連する問題