无效的参数编号 - PDO错误
请不要因为询问多次询问过的问题而陷害我。我花了好几个小时翻阅答案,但找不到解决方案。我只是学习使用PDO。我已经成功地用它从数据库中选择并显示结果,但是我遇到了Update函数的问题。无效的参数编号 - 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();
}
你缺少的WHERE子句中:article_id
绑定。因此,您的预准备语句与执行后传递的参数之间的参数数量不匹配。
也如上面注释中所述,不要使用“escape_string”类型的函数。没有必要使用参数化准备好的语句,事实上,当您遇到会遇到转义序列的情况时,会在记录的数据中引入意外字符转义。
而且,在这里:
edited_by = : edited_by
你可能想失去冒号后的空间。我真的不知道这是否会导致错误,但它至少是糟糕的形式。
同意,但是Mike,再次查看OP的代码'mysql_escape_string'什么都不会在DB中输入。 OP不需要使用这些,可以完全省略它。 – 2014-10-20 14:31:05
@ Fred-ii-我同意这是一个问题,但实际上并不是引起错误信息的问题。 – 2014-10-20 14:32:35
我在上面用“同意”编辑了我的评论;) – 2014-10-20 14:33:02
当然,我可以在你的SQL中看到11个占位符,只有10个参数被绑定。你在哪里绑定':article_id'? – George 2014-10-20 14:27:47
所有对'mysql_real_escape_string()'的调用都是不必要的,在这种情况下是无效的。不需要转义,因为PDO将在绑定参数时处理该转义。 'mysql_real_escape_string()'只能通过'mysql_query()'激活连接。 – 2014-10-20 14:28:35
混合MySQL API。与*杜松子酒不同,这些'mysql_'和PDO不会。 – 2014-10-20 14:28:57