Привет, я посмотрел вокруг здесь, но, похоже, не может найти ответ тоже моей проблемой.
Это первый раз, когда я использовал PDO, и для меня это полный новичок.
У меня есть загрузка данных, разделенных на 2 таблицы, и вы хотите объединить их в один, есть другие способы сделать это, но, не вдаваясь в сложные причины, почему, я пытаюсь сделать это таким образом …
Я создаю набор записей таблицы, в которой я хочу скопировать данные из
построить мое заявление
запустить его в цикле
но я получаю следующую ошибку
SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match 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...");
в//$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...");
Отсутствующие двоеточия
:blabelimage_rec, **:**asound_rec, **:**bsound_rec, :featured_rec, :format_rec
Похоже, Марк Бейкер уже ответил на ваш вопрос, но я хотел добавить пару советов, которые очень помогли мне.
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-выражения для многоуровневых (например, выше) и с тех пор, как у меня было меньше ошибок, подобных этому. Это занимает много места, но я думаю, в конце концов, это того стоит. Все, что выстраивается в линию, заставляет ошибки торчать, как больной палец.
Счастливое кодирование!