2014-10-20 4 views
0

Пожалуйста, не заставляйте меня задавать вопрос, который был задан много раз. Я потратил часы, пашущие ответы, но не могу найти решение для моего. Я просто участвую в PDO. Я успешно использовал его для выбора из базы данных и отображения результатов, но у меня возникла проблема с функцией обновления.Недопустимый номер параметра - ошибка PDO

Я получаю сообщение об ошибке: SQLSTATE [HY093]: Недопустимый номер параметра: параметр не определен.

Я проверил и перепроверял мой код, но нет опечаток на меня, поэтому, возможно, это связано с полем edit_date? Если кто-нибудь может мне помочь, я был бы очень благодарен, поскольку я потратил несколько часов на исследования и эксперименты без решения. С уважением Tog.

вот код:

$article_id = (trim ($_POST [ 'id' ]) == ' ') ? die ('ERROR:no ID') : mysql_escape_string ($_POST [ 'id' ]); 
    $article_id = (INT) $article_id; 
    $title = (trim ($_POST [ 'title' ]) == ' ') ? die ('ERROR: Enter a Title') : mysql_escape_string ($_POST [ 'title' ]); 
      $author = (trim ($_POST [ 'author' ]) == ' ') ? die ('ERROR: Enter an Author name') : mysql_escape_string ($_POST [ 'author' ]); 
      $image_url = (trim ($_POST [ 'image_url' ]) == ' ') ? die ('ERROR: Enter an Image URL') : mysql_escape_string ($_POST [ 'image_url' ]); 
      $main_article = (trim ($_POST [ 'main_article' ]) == ' ') ? die ('ERROR: Enter some article content') : mysql_escape_string ($_POST [ 'main_article' ]); 
      $snippet = (trim ($_POST [ 'snippet' ]) == ' ') ? die ('ERROR: Enter snippet text') : mysql_escape_string ($_POST [ 'snippet' ]); 
      $friendly_url = (trim ($_POST [ 'friendly_url' ]) == ' ') ? die ('ERROR: Enter a friendly url') : mysql_escape_string ($_POST [ 'friendly_url' ]); 
      $meta_title = (trim ($_POST [ 'meta_title' ]) == ' ') ? die ('ERROR: Enter a Meta Title') : mysql_escape_string ($_POST [ 'meta_title' ]); 
      $meta_description = (trim ($_POST [ 'meta_description' ]) == ' ') ? die ('ERROR: Enter a Meta Description') : mysql_escape_string ($_POST [ 'meta_description' ]); 
      $edited_by = (trim ($_POST [ 'edited_by' ]) == ' ') ? die ('ERROR: who edited this?') : mysql_escape_string ($_POST [ 'edited_by' ]); 
      $edit_date = CURRENT_TIMESTAMP; 

    try { 
     $dbh = new PDO("mysql:host=$hostname;dbname=gosport", $username, $password); 
     /*** echo a message saying we have connected ***/ 
     echo 'Connected to database<br />'; 
     $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     /*** Update data ***/ 
     $sql = "UPDATE sport SET title = :title, 
       author = :author, 
       image_url = :image_url, 
       main_article = :main_article, 
       snippet = :snippet, 
       edit_date = :edit_date, 
       friendly_url = :friendly_url, 
       meta_title = :meta_title, 
       meta_description = :meta_description, 
       edited_by = : edited_by 
       WHERE article_id = :article_id"; 
    $stmt = $dbh->prepare($sql);         
    $stmt->bindParam(':title', $title, PDO::PARAM_STR);  
    $stmt->bindParam(':author', $author, PDO::PARAM_STR); 
    $stmt->bindParam(':image_url', $image_url, PDO::PARAM_STR); 
    $stmt->bindParam(':main_article', $main_article, PDO::PARAM_STR); 
    $stmt->bindParam(':snippet', $snippet, PDO::PARAM_STR); 
    $stmt->bindParam(':edit_date', $edit_date, PDO::PARAM_STR); 
    $stmt->bindParam(':friendly_url', $friendly_url, PDO::PARAM_STR); 
    $stmt->bindParam(':meta_title', $meta_title, PDO::PARAM_STR); 
    $stmt->bindParam(':meta_description', $meta_description, PDO::PARAM_STR); 
    $stmt->bindParam(':edited_by', $edited_by, PDO::PARAM_STR); 

    $stmt->execute(); 
      /*** close the database connection ***/ 
     $dbh = null; 
     } 
    catch(PDOException $e) 
     { 
     echo $e->getMessage(); 
     } 

Спасибо за ответы. Я внес некоторые изменения и больше не получаю сообщение об ошибке, но когда я запускаю код, он не обновляет базу данных. Все остается таким же, как и до запуска кода.

Мой новый код:

$article_id = (trim ($_POST [ 'id' ]) == ' '); 
$article_id = (INT) $article_id; 
$title = (trim ($_POST [ 'title' ]) == ' '); 
$author = (trim ($_POST [ 'author' ]) == ' '); 
$image_url = (trim ($_POST [ 'image_url' ]) == ' '); 
$main_article = (trim ($_POST [ 'main_article' ]) == ' '); 
$snippet = (trim ($_POST [ 'snippet' ]) == ' '); 
$friendly_url = (trim ($_POST [ 'friendly_url' ]) == ' '); 
$meta_title = (trim ($_POST [ 'meta_title' ]) == ' '); 
$meta_description = (trim ($_POST [ 'meta_description' ]) == ' '); 
$edited_by = (trim ($_POST [ 'edited_by' ]) == ' '); 
$edit_date = CURRENT_TIMESTAMP; 

try { 
    $dbh = new PDO("mysql:host=$hostname;dbname=gosport", $username, $password); 
    /*** echo a message saying we have connected ***/ 
    echo 'Connected to database<br />'; 
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    /*** Update data ***/ 
    $sql = "UPDATE sport SET title = :title, 
      author = :author, 
      image_url = :image_url, 
      main_article = :main_article, 
      snippet = :snippet, 
      edit_date = :edit_date, 
      friendly_url = :friendly_url, 
      meta_title = :meta_title, 
      meta_description = :meta_description, 
      edited_by = :edited_by 
      WHERE article_id = :article_id"; 
$stmt = $dbh->prepare($sql); 
$stmt->bindParam(':article_id', $article_id, PDO::PARAM_STR);          
$stmt->bindParam(':title', $title, PDO::PARAM_STR);  
$stmt->bindParam(':author', $author, PDO::PARAM_STR); 
$stmt->bindParam(':image_url', $image_url, PDO::PARAM_STR); 
$stmt->bindParam(':main_article', $main_article, PDO::PARAM_STR); 
$stmt->bindParam(':snippet', $snippet, PDO::PARAM_STR); 
$stmt->bindParam(':edit_date', $edit_date, PDO::PARAM_STR); 
$stmt->bindParam(':friendly_url', $friendly_url, PDO::PARAM_STR); 
$stmt->bindParam(':meta_title', $meta_title, PDO::PARAM_STR); 
$stmt->bindParam('meta_description', $meta_description, PDO::PARAM_STR); 
$stmt->bindParam(':edited_by', $edited_by, PDO::PARAM_STR); 

$stmt->execute(); 
     /*** close the database connection ***/ 
    $dbh = null; 
    } 
catch(PDOException $e) 
    { 
    echo $e->getMessage(); 
    } 
+2

Конечно, я вижу 11 заполнителей в вашем SQL и только 10 параметров. Где вы связываете ': article_id'? – George

+3

Все эти вызовы 'mysql_real_escape_string()' в этом контексте не нужны и недействительны. Не требуется экранирование, поскольку PDO будет обрабатывать это при привязке параметров. 'mysql_real_escape_string()' может работать в любом случае с активным подключением через 'mysql_query()'. –

+0

Смешивание API MySQL. В отличие от * gin & tonic *, эти 'mysql_' и PDO просто нет. –

ответ

1

У вас не хватает привязки для :article_id в предложении WHERE. Таким образом, вы имеете несоответствующее количество параметров между вашим подготовленным оператором и параметрами, переданными при выполнении.

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

Кроме того, здесь:

edited_by = : edited_by 

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

+0

Согласен, но Майк, снова посмотрите на код OP 'mysql_escape_string', ничего не будет введено в БД. OP не нужно использовать их, можно просто опустить его вообще. –

+0

@ Fred-ii- Я согласен, что это проблема, но это не проблема, вызывающая сообщение об ошибке. –

+0

Который я отредактировал мой комментарий выше с «согласованными»;) –

Смежные вопросы