【问题标题】:INSERT INTO not inserting for meINSERT INTO 不为我插入
【发布时间】:2014-07-19 18:24:23
【问题描述】:

我看不出这有什么问题,但它就是行不通。

快速纲要:在上一页填写的表格,$_POST['']'s 添加到 $_SESSION['']'s,$vars 从 $_SESSION['']'s 设置,$vars 用于mysqli_query。

我确定问题正困扰着我,但我就是看不到它。

代码如下:(已更新)

if(isset($_POST['list_make']) && $_POST['list_make'] != '') { $list_make  = $_POST['list_make']; $_SESSION['list_make'] = $list_make; }
if(isset($_SESSION['list_make']) && $_SESSION['list_make'] != '') { $list_make = $_SESSION['list_make']; } else { $list_make = ''; }

$add_car_query = "INSERT INTO car_details 
    (car_user_id, car_user_number, car_date_added, car_make, car_model, car_date_registered, car_odometer, 
        car_engine_size, car_color, car_body_type, car_owners, car_nct_date, car_rax_date) 
    VALUES 
    ('$user_id_new', '$new_user_number', '$today', '$list_make', '$list_model', '$list_year', '$list_kilometers', 
        '$list_engine_size', '$list_color', '$list_body_type', '$list_previous_owners', '$list_nct', '$list_tax')
    ";
if(mysqli_query($con, $add_car_query)) { $added = 'added'; } else { $added = 'Not happening'; }

【问题讨论】:

  • “不起作用”通常可以由mysqli_error() 更好地限定。不过,很容易推测这里缺少数据库转义。
  • 您应该使用准备好的语句。现在你的代码很不安全!
  • 正如 mario 所说,在 else 部分包含对 mysqli_error() 的调用。然后使用错误消息更新您的问题。 Marcin Nabiałek 关于准备好的陈述是正确的。
  • 你有没有注意到你甚至不在乎解释 if/else 的哪个分支执行?
  • 没有返回错误,如果是,我会知道问题出在哪里:p

标签: php mysqli insert


【解决方案1】:

尝试检查else中是否存在MySQLi错误(如果查询失败将触发):

$add_car_query = "INSERT INTO car_details 
    (car_user_id, car_user_number, car_date_added, car_make, car_model, car_date_registered, car_odometer, 
        car_engine_size, car_color, car_body_type, car_owners, car_nct_date, car_rax_date) 
    VALUES 
    ('$user_id_new', '$new_user_number', '$today', '$list_make', '$list_model', '$list_year', '$list_kilometers', 
        '$list_engine_size', '$list_color', '$list_body_type', '$list_previous_owners', '$list_nct', '$list_tax')
    ";
if(mysqli_query($con, $add_car_query)) { 
  $added = 'added'; 
} 
else { 

  // check for the error here
  if(mysqli_error()) {
    echo mysqli_error();
  }

  $added = 'Not happening'; 
}

准备好的陈述

正如 cmets 中的某人所说,您应该使用 prepared statements 以获得更好的安全性。这样您就不必担心转义输入(看起来您现在没有转义值 very dangerous)。

不过,它可能会与问号占位符有点混淆(不幸的是,MySQLi 不支持命名参数)。准备好的语句使用 OOP MySQLi 更好,但是您使用的是过程,所以这里是您如何为您的问题中的查询执行准备好的语句:

$add_car_query = "INSERT INTO car_details 
    (car_user_id, 
     car_user_number, 
     car_date_added, 
     car_make, 
     car_model, 
     car_date_registered, 
     car_odometer, 
     car_engine_size, 
     car_color, 
     car_body_type, 
     car_owners, 
     car_nct_date, 
     car_rax_date) 
    VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";

$stmt = mysqli_stmt_prepare($con, $add_car_query);

// if any of the values are an int, change the 
// corresponding 's' (which means string) to 'i' (integer).
// more info: http://us.php.net/manual/en/mysqli-stmt.bind-param.php

mysqli_stmt_bind_param($stmt, 'sssssssssssss', 
                       $user_id_new, 
                       $new_user_number, 
                       $today, 
                       $list_make, 
                       $list_model, 
                       $list_year, 
                       $list_kilometers, 
                       $list_engine_size, 
                       $list_color, 
                       $list_body_type, 
                       $list_previous_owners, 
                       $list_nct, 
                       $list_tax);
$stmt_exe = mysqli_stmt_execute($stmt);

if($stmt_exe) { 
   $added = 'added'; 
} 
else { 
   if(mysqli_error()) {
     echo mysqli_error();
   }
   $added = 'Not happening'; 
}

【讨论】:

  • 感谢 Nathan,我每天都学到新东西! :) 实际的问题,我发现确实是盯着我的脸……我真正在寻找的是第二双眼睛(而不是让人们贬低我在这里的小名声),看看代码中是否有任何东西不合适..它是'car_tax_date;中的错字;,我有'car_rax_date'..再次感谢您抽出时间发布此代码,确实对我有帮助:)我不能投票,因为我还没有 15 个代表,但只要我做到了,我就会回来!
  • @EoinH 没问题,很高兴您发现了问题!我很惊讶我没有看到错字。我想我并没有真正注意变量和列名。此外,即使您还不能投票,如果第一部分有助于找到错误,您仍然可以接受我的回答:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-13
  • 1970-01-01
  • 2014-12-07
  • 1970-01-01
  • 2014-04-04
  • 1970-01-01
相关资源
最近更新 更多