Количество связанных переменных PHP Mysql PDO не соответствует количеству токенов

Я осмотрелся здесь, но, похоже, не нашел ответа на свою проблему.

Это первый раз, когда я использую PDO, поэтому я новичок в этом.

У меня есть загрузка данных, разделенных на 2 таблицы, и я хочу объединить их в одну, есть другие способы сделать это, но не вдаваясь в сложные причины, по которым я пытаюсь сделать это таким образом ...

Я создаю набор записей таблицы, из которой хочу скопировать данные

составить мое заявление

запустить его в цикле

но я получаю следующую ошибку

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

Я прошел и трижды проверил, у меня такое же количество переменных, так что почему «токены не совпадают, я не знаю», как я уже сказал, я очень новичок в этом, поэтому, вероятно, не хватает чего-то, что профессионалы сочли бы очевидным.

  • Вероятно, стоит упомянуть, что я не добавляю каждый столбец в таблице, есть другие столбцы, но я оставил их вне подготовленного оператора ... Вот мой код:

    //$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...");
    

person Dizzy Bryan High    schedule 17.02.2012    source источник


Ответы (2)


Отсутствие двоеточия

:blabelimage_rec, **:**asound_rec, **:**bsound_rec, :featured_rec, :format_rec
person Mark Baker    schedule 17.02.2012

Похоже, Марк Бейкер уже ответил на ваш вопрос, но я хотел добавить пару советов, которые мне очень помогли.

PDO не требует mysql_escape_string
Пока все, что входит в ваш запрос, связанный с пользовательским вводом, использует подготовленный оператор (как вы, выше), вам не нужно экранировать ввод с mysql_real_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: чем он короче, тем проще его поддерживать и вы с меньшей вероятностью сделаете ошибки. Вы можете использовать альтернативный синтаксис INSERT [2]:

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

эквивалентно:

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

Это означает, что для больших операторов, подобных вашему, вы можете эффективно половину его размера, потому что вам не нужно повторять все имена столбцов:

$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




Делайте ваши SQL-выражения многострочными и красивыми

Я начал форматировать свои операторы SQL, чтобы они были многострочными (как указано выше), и с тех пор у меня было НАМНОГО меньше подобных ошибок. Он действительно занимает много места, но я думаю, что в конце концов оно того стоит. Выстраивая все в линию, ошибки становятся заметными, как больной палец.

Удачного кодирования!

person Steve    schedule 17.02.2012
comment
Я не могу проголосовать за это достаточно! - person Mawg says reinstate Monica; 08.09.2015