【问题标题】:SQL not Inserting using PHPSQL 未使用 PHP 插入
【发布时间】:2020-09-05 17:50:20
【问题描述】:

我有以下代码将数据从表单发送到 SQL 数据库:

<?php
session_start();
ob_start();
include 'includes/db_connection.php';

if(empty($_POST)){
    header("Location: index.php");
}
else{
    try {
        $dbconn = OpenCon();
        $fname = $_POST['fnameInput'];
        $sname = $_POST['snameInput'];
        $sex = $_POST['sexInput'];
        $dob = $_POST['dobInput'];
        $schoolID = $_SESSION['school'];
        $sqlstmnt2 = 'INSERT INTO students (`firstName`, `surname`, `dob`, `gender`, `schoolID`) VALUES (:firstName, :surname, :dob, :gender, :schoolID)';
        $stmtUsr2 = $dbconn -> prepare($sqlstmnt2);
        $stmtUsr2 -> bindValue(':firstName', $fname);
        $stmtUsr2 -> bindValue(':surname', $sname);
        $stmtUsr2 -> bindValue(':dob', $dob);
        $stmtUsr2 -> bindValue(':gender', $sex);
        $stmtUsr2 -> bindValue(':schoolID', $schoolID);
        $stmtUsr2 -> execute();
        // redirect to pupil's profile
        header("Location: pupilprofile.php");
        die();
        } 
    catch (PDOException $e) {
        echo "DataBase Error: The user could not be added.<br>".$e->getMessage();
    } 
    catch (Exception $e) {
        echo "General Error: The user could not be added.<br>".$e->getMessage();
    }
}
?>

我的数据库表的结构是 studentID 作为主键自动递增,除了 dob 之外的所有字段都是文本(dob 设置为日期时间)

发送数据的表单如下所示:

<form action="registersubmit.php" method="post">
    First Name: <input type="text" autocomplete="off" name="fnameInput"><div id="erfirstname"></div><br>
    Surname: <input type="text" autocomplete="off" name="snameInput"><div id="ersurname"></div><br>
    Sex:      <select id="sexInput" name="sexInput">
        <option value="male">Male</option>
        <option value="female">Female</option>
    </select><div id="ersex"></div><br>
    DOB:    <input type="text" id="datepicker" name="dobInput"><div id="erdob"></p>
    <input type="submit" name="pupilRegSubmit" value="Register" onclick="if(validatePupilReg()) this.form.submit()">
</form>

我没有收到 PDO 错误,但数据没有插入到表中。我在想这可能与日期选择器与 SQL 中的数据类型不匹配有关,但我不确定。有什么想法吗?

【问题讨论】:

  • 您是否尝试过不使用ob_start() 来查看是否有任何输出。
  • execute()之后尝试print_r($stmtUsr2-&gt;errorInfo());找出插入错误
  • 如果您的数据库表有 studentID 作为自动增量,并且您尝试使用提供的值进行插入,那么您很可能会收到有关表中已存在值的错误。在使用自动增量对表进行插入时,最好不要在插入语句中传递该列......让它完成它的工作。确保您的 PDO 也配置为抛出异常 $your_pdoobject-&gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  • OK 我有以下错误消息,我猜这是 Datepicker 的数据类型和 SQL 字段的数据类型之间的问题。 thisArray ( [0] => 22007 [1] => 1292 [2] => 不正确的日期时间值:第 1 行的列 'dob' 的日期时间值是 '08/10/2020')

标签: php sql


【解决方案1】:

在 PHP 中获取 MySQL 错误

您可以通过打印$statement-&gt;execute() 的结果来知道MySQLi 语句是否成功。引用 POD...

返回值

成功时返回 TRUE,失败时返回 FALSE。 (来源:PHP.net

如果它返回TRUE,那么可能存在与语句失败不同的问题。

您还可以从 PHP 中的 MySQLi 包中查看带有 error()errno() 的 MySQL 语句的结果。您没有在代码中列出它,但您必须以这样的方式定义$dbconn...

$dbconn = new mysqli($hostname, $username, $password, $database);

使用$stmtUsr2 -&gt; execute(); 执行后,尝试运行这段代码...

print_r($dbconn->error);
print_r($dbconn->errno);

您的具体案例

更改日期选择器的格式以匹配 MySQL 的插入格式。

$(selector).datepicker({
        dateFormat: 'yy-mm-dd',
});

更多帮助

我有另一个关于在此处获取更多调试信息的答案:debug_print_backtrace() to String for log-file

【讨论】:

  • 谢谢,但我没有从错误中得到任何打印结果。 dbconn 工作正常,因为我有其他代码成功使用它
  • @user1480135 感谢您回复我,OpenCon(); 返回了什么?另外,也许尝试打印 $statement->execute() 的结果?如果为 0,则失败(我假设是这种情况),但如果报告为 1,则可能有其他问题。
  • 奇怪的是我没有得到 0 或 1 通过键入 $result = $statement->execute() 然后回显 $result
  • @user1480135 : 你能禁用这条线header("Location: pupilprofile.php");吗?否则页面会在你看到任何东西之前简单地重定向。
  • 错误显示为 thisArray ( [0] => 22007 [1] => 1292 [2] => 不正确的日期时间值:'08/10/2020' for column 'dob' at row 1)
【解决方案2】:

添加

dateFormat: 'yy-mm-dd'

进入 Datepicker 函数以匹配 MySQL 日期时间字段的格式

【讨论】:

  • 所以,我帮您调试了问题,如何获取 MySQL 错误,并为您找到了错误和解决方案。将我的答案标记为正确而不是重新发布为您自己的答案似乎不是更合作吗?
  • 对不起,当我在别处找到答案时,我没有看到您的修改
【解决方案3】:

是 onclick="if(validatePupilReg()) this.form.submit() 工作吗?

使用 AJAX/JQuery 进行表单提交:

$('form').on('click', function() {  

    var form_input = $(this).serialize();

    $.ajax({
        type: "POST",
        url: "/ajax_calls/xxx",
        data: form_input,
        success: function(this_result){

【讨论】:

  • 它一定能正常工作,因为我之前从狡猾的语法中得到了 PDO 错误输出
  • @henry551:如何使用 AJAX/JQuery(一种前端语言)来解决 MySQL(一种后端语言)未执行的错误?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-21
  • 1970-01-01
  • 2017-04-08
  • 2012-12-13
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
相关资源
最近更新 更多