Вставить массив в PDO (PHP): «SQLSTATE [HY093]: неверный номер параметра» - PullRequest
0 голосов
/ 04 мая 2019

Вставка массива через PDO в базу данных MySQL с PHP не работает для меня. Он говорит «неверный номер параметра», хотя массив имеет 41 значение; PDO называет 41 столбец; и подготовленный запрос имеет 41 вопросительный знак.

Массив имеет 41 значение (я проверял с помощью var_dump), например:

$data = [
    'countrycode' => $_GET["id"],
    'country' => $_GET["country"],
    'region' => $_GET["region"],
    'law_db_region' => $_GET["law_db_region"],
    [... etc ...]
 ]

Мой код PDO следующий (да, это 41 столбец и 41 знак вопроса):

$sql = "INSERT INTO awards_country
    (countrycode, country, region, law_db_region, law_db_national,
    law_db_national2, const_url, const_version, const_date, const_dummy,
    const_article, const_wording, const_article2, const_wording2, const_article3,
    const_wording3, law_dummy, law_act, law_article, law_source,
    law_date, law_act2, law_article2, law_source2, law_date2,
    law_act3, law_article3, law_source3, law_date3, web_dummy,
    web_url, web_organ, web_language, web_date, web_url2,
    web_organ2, web_language2, web_date2, wikipedia_url, wikipedia_date,
    comment)

    VALUES (
    ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
    ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
    ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
    ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?
    )";
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn->prepare($sql);
$stmt->execute($data);

Я все же получаю ошибку:

Неустранимая ошибка: необработанное исключение PDO: SQLSTATE [HY093]: неверный параметр номер: параметр не был определен в [...] country-insert.php: 99

Трассировка стека: # 0 [...] country-insert.php (99): PDOStatement-> execute (Array) # 1 {main} добавляется /data/web/e96483/html/awards/country-insert.php в строке 99

Ответы [ 2 ]

2 голосов
/ 04 мая 2019

Не ответ, а рекомендация (и в целом для комментария).

Извлечено из вашего кода и переформатировано для ясности:

const_article,  const_wording,
const_article2, const_wording2,
const_article3, const_wording3,
...
law_act,  law_article,  law_source,  law_date,
law_act2, law_article2, law_source2, law_date2,
law_act3, law_article3, law_source3, law_date3,

Кажется, это соотношение 1: N. И вы работаете с системой реляционных баз данных (MySQL). Так почему бы не использовать отношения и одну или несколько дополнительных таблиц?

Фактически, если вы не используете отношения здесь, это усложнит другой (будущий) запрос.

1 голос
/ 04 мая 2019

за?param вы не должны использовать ассоциативный массив, а передавать значения как позиционные

$data = [
    $_GET["id"],
    $_GET["country"],
    $_GET["region"],
     $_GET["law_db_region"],
    [... etc ...]
 ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...