【问题标题】:php insert statement has correct arguments but insert is returning falsephp insert 语句具有正确的参数,但 insert 返回 false
【发布时间】:2016-05-09 13:34:31
【问题描述】:

好的,所以我的插入应该没问题,但返回错误,$quote 持有我检查过的值。我的数据库是here希望另一双眼睛能发现这一点。我一直在为其他 php 文件使用相同的插入样式,效果很好。但是这个很棘手......因为外键而错过了?

    <?php

$quote = $_POST["quote"];
require "init.php";

$query = "INSERT INTO `quote`(`quote_description`) VALUES('".$quote."');";
$result = mysqli_query($con,$query);


//"INSERT INTO `quote`(`quote_description`) VALUES ('".$quote."');";

if($result)
{
    $response = array();
    $code = "submit_true";
    $message = "Quote success, Click Ok to continue";
    array_push($response,array("code"=>$code,"message"=>$message));
    echo json_encode(array("server_response"=>$response));


}

else{
    $response = array();
    $code = "submit_false";
    $message = "Sorry, some server error occurred, please try again";
    array_push($response,array("code"=>$code,"message"=>$message));
    echo json_encode(array("server_response"=>$response));


}
mysqli_close($con);

?>

检查错误后出现以下错误:

无法添加或更新子行:外键约束失败(mydb.quote, CONSTRAINT fk_quote_user FOREIGN KEY (user_id) REFERENCES user (user_id) ON DELETE NO ACTION ON UPDATE NO ACTION)

【问题讨论】:

  • 请查阅以下链接 php.net/manual/en/mysqli.error.phpphp.net/manual/en/function.error-reporting.php 并将其应用于您的代码;你没有那样做。另外,这里有一些未知数;如果 POST 数组包含一个值和用于连接的 MySQL API。
  • 如果$quote 包含例如引用',您将自己注入sql。您应该改用准备好的语句。
  • $con 未定义,不是吗?
  • ^ ... No.... you need to refer to comment #1... 得到 real 错误,说明为什么它在这里失败了。使用准备好的语句可能会起作用,但它不会告诉你为什么你的原始代码会失败并且可能仍然会让你失败。
  • $stmt-&gt;execute() => if(!$stmt-&gt;execute()){trigger_error("there was an error....".$con-&gt;error, E_USER_WARNING);}&lt;?php error_reporting(E_ALL); ini_set('display_errors', 1); // rest of code

标签: php mysql sql-insert


【解决方案1】:

在 MySQL 中使用 INSERT 时,您必须包含所有要插入的列和值。试试这个;

$query = "INSERT INTO quote(quote_id, quote_description, quote_points, user_id, Quote_of_day_id) VALUES(NULL, '".$quote."', '".$points."', '".$user_id."', '".$qod_id."');";

如果您没有为此查询插入的所有值,只需将它们设置为空即可。要稍后添加值,请使用 UPDATE:

$query = "UPDATE quote SET user_id = 8 WHERE quote_id = 6";

虽然这是一种插入解决方案,但它不安全并且容易受到sql injection 的攻击。这是更安全的更好的面向对象的解决方案,我建议在任何其他不安全的 INSERTS 上使用它:

$db = new mysqli($host, $user, $pass, $database);
$stmt = $db->prepare('INSERT INTO quote(quote_id, quote_description, quote_points, user_id, Quote_of_day_id) VALUES(?, ?, ?, ?, ?);');
$stmt->bind_param('isiii', $quote_id, $quote, $points, $user_id, $qod_id);

$stmt->execute();

添加它来处理您的 POST 数据也是一个好主意:

if(!isset($_POST["quote"])) {
    echo "Data not received correctly";
    exit();
}

希望这些示例对您有所帮助。祝你一切顺利。

【讨论】:

  • 我会进一步研究你的例子,事实上这真的很有帮助。谢谢:)
  • 很高兴为您提供帮助。谢谢@BowieChang
  • 设法做到了。谢谢队友和你们其他人。对不起,如果我看起来有点初学者,我是。编码和堆栈溢出的新手。希望继续与大家合作!干杯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
  • 2015-07-07
  • 2021-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多