【问题标题】:Mysqli INSERT with $_POSTMysqli INSERT 与 $_POST
【发布时间】:2013-10-23 14:53:29
【问题描述】:

我已经为这个问题扯了几天的头发,所以任何有用的建议都将不胜感激。调用以下函数不会返回任何内容。 POST 值已设置(它们使用 echo 打印),数据库让我可以使用其他功能进行更新和提取。我错过了什么?

哦,是的,所有的值都是字符串。

$stmt = $db->prepare("INSERT INTO content_page (name, layout, page_id) VALUES (?,?,?)");    
$stmt->bind_param("sss", $_POST['name'], $_POST['layout'], $_POST['page_id']);
$stmt->execute();
$stmt->close();

【问题讨论】:

  • 值是否正确插入数据库?
  • 我假设 page_id 是一个整数值,所以您可能应该指出像...bind_param('ssi', ... 这样的变量我假设错了吗?
  • var_dump($stmt->ErrorInfo()) 有什么显示吗?
  • 您是否检查过 $stmt 不是布尔值 false,例如准备失败?您没有检查任何返回值,这意味着您只是假设成功。永远不要假设成功。始终假设失败并将成功视为惊喜。
  • -1 表示令人困惑的问题

标签: php database insert mysqli


【解决方案1】:

乍看之下,这段代码没有任何问题(如果你确实在使用 mysqli)。因此,了解问题所在的唯一方法是获取错误消息。

在连接前添加这一行

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

并确保您可以看到 PHP 错误

【讨论】:

  • 这应该是一条评论
  • @DanFromGermany 实际上问题是“我错过了什么”......他错过了错误报告:)
  • 问题中的一切都是Mysqli
【解决方案2】:

试试这个

$sql = "INSERT INTO content_page (name, layout, page_id) VALUES (?,?,?)";
if (!$stmt = $db->prepare($sql)) {
    die($db->error);
}
$stmt->bind_param("ssi", $_POST['name'], $_POST['layout'], $_POST['page_id']);
if (!$stmt->execute()) {
    die($stmt->error);
}
$stmt->close();

或者,如你所说,如果你所有的值都是字符串(假设它们在你的数据库中被定义为 varchars/类似的东西),你仍然可以bind_param("sss"...

【讨论】:

  • 感谢您提供非常有帮助的答案,添加错误报告后发现我的问题出在数据库上。以后我会更频繁地使用错误报告!
  • @ViktorBurström 这是一种相当过时的错误报告方式,而且肯定是不安全的一种。只是一个友好的警告。
  • @YourCommonSense 你能解释一下为什么吗?对我来说也会很有趣 :) 我很久以前就停止使用 MySQLi,所以我对它的了解肯定已经过时了
  • 这不是 mysqli 的问题,而是安全基础的问题。一条错误消息,在现场网站上直接交到潜在黑客手中,对他来说无疑是一份圣诞礼物。
  • 你是对的。我实际上只是想让他得到一个 MySQL 错误输出来检查他的数据库,而不是把它作为他的最终解决方案。应该提到的。在这种情况下,您的答案是正确的。谢谢你:)
【解决方案3】:

不是 page_id整数 吗?由于提问者首先将问题标记为 PDO,因此这里是 PDO 版本:

$stmt = $db->prepare("INSERT INTO content_page (name, layout, page_id) VALUES (:name,:layout,:pid)");
$sth->bindParam(':name', $_POST['name'], PDO::PARAM_STR);
$sth->bindParam(':layout', $_POST['layout'], PDO::PARAM_STR);
$sth->bindParam(':pid', $_POST['page_id'], PDO::PARAM_INT);
$stmt->execute();

或(MySQLi):

$stmt = $db->prepare("INSERT INTO content_page (name, layout, page_id) VALUES (?,?,?)");
$stmt->bind_param("ssi", $_POST['name'], $_POST['layout'], $_POST['page_id']);
$stmt->execute();

或(PDO):

$stmt = $db->prepare("INSERT INTO content_page (name, layout, page_id) VALUES (?,?,?)");
$stmt->execute(array($_POST['name'], $_POST['layout'], $_POST['page_id']));

【讨论】:

  • 为什么要省略 bind_param 函数?这没有错
  • sss = 字符串字符串字符串
  • 我不认为你可以在 SQL 语句中使用命名参数,如 MySQLi 中的:name .. IIRC 它必须是一个问号
  • @Subin 也许我看到了你的答案的旧版本,但你在 MySQLi 部分中首先命名了参数;)我知道上半部分是 PDO,你可以,我也知道的,使用命名参数。你的下半部分是 MySQLi,你不能。这就是我所指的。但现在这个版本是正确的。
  • "s" 表示整数的效果与 "i" 一样好。因此,您的版本与 OP 没有什么不同。仅当您确定原因时才回答问题。
【解决方案4】:

你在这里:

$name = $_POST['layout'];
$layout = $_POST['layout'];
$page_id= $_POST['page_id'];

$stmt = $db->prepare("INSERT INTO content_page (name, layout, page_id) VALUES ('".$name."','".$layout."','".$page_id."')");  

【讨论】:

  • 这是你不能做的完美例子
  • PDO 用于逃避 SQL 注入
猜你喜欢
  • 2011-07-07
  • 2013-09-19
  • 2013-08-25
  • 2016-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-18
相关资源
最近更新 更多