繁体   English   中英

PDO INSERT语句静默失败

[英]PDO INSERT statement silently failing

在我的测试环境(即MAMP 4.5)中,该语句可以毫无问题地完美运行。 但是,当我在测试VM上使用相同的语句时,INSERT失败,没有错误。

我正在使用它来捕获任何错误:

try {
        // http://php.net/manual/en/pdo.connections.php
        $dbConn = new PDO("mysql:host={$databaseHost};dbname={$databaseName}", $databaseUsername, $databasePassword);

        $dbConn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Setting Error Mode as Exception
        // More on setAttribute: http://php.net/manual/en/pdo.setattribute.php
    } catch(PDOException $e) {
        echo $e->getMessage();
    }

这是我的INSERT语句:

<?php
    // Database connection file
    include_once("../config.php");

    if(isset($_POST['Submit'])) {
        $status=$_POST['status'];
        $system=$_POST['system'];
        $first_name=$_POST['first_name'];
        $last_name=$_POST['last_name'];
        $primary_num=$_POST['primary_num'];
        
        // Insert data into table
        $sql = "INSERT INTO table(
            status,
            system,
            first_name,
            last_name,
            primary_num
        ) VALUES(
            :status,
            :system,
            :first_name,
            :last_name,
            :primary_num
        )";

        $query = $dbConn->prepare($sql);
        
        $query->bindParam(':status', $status);
        $query->bindParam(':system', $system);
        $query->bindParam(':first_name', $first_name);
        $query->bindParam(':last_name', $last_name);
        $query->bindParam(':primary_num', $primary_num);

        $query->execute();

        // Redirect to the display page
        header("Location: index.php");

    }
?>

固定:

我将数据库中每列的默认值(主键除外)设置为NULL,现在数据成功发布了!

您可以尝试打印内部错误信息,以防万一实际上没有引发异常:

// http://php.net/manual/en/pdostatement.errorinfo.php
$error = $query->errorInfo();

// see if anything is output here
print_r($error);

您还在注释中提到了 execute()调用之前出现错误的注释。 可能是因为您对bindparam()使用了所有小写名称。

http://php.net/manual/zh/pdostatement.bindparam.php

尝试将参数绑定更改为此:

$query->bindParam(':status', $status);
$query->bindParam(':system', $system);
$query->bindParam(':first_name', $first_name);
$query->bindParam(':last_name', $last_name);
$query->bindParam(':primary_num', $primary_num);

或者更好; 删除上面的行,并在execute()调用中进行设置:

$query->execute([
    'status'      => $status,
    'first_name'  => $first_name,
    'last_name'   => $last_name,
    'primary_num' => $primary_num,
]);

如果上述信息无济于事,您可以确定已启用错误报告吗? 根据此答案的说明,您可以这样操作:

ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

删除:在bindParam中

$ query-> bindParam('status',$ status); $ query-> bindParam('system',$ system); $ query-> bindParam('first_name',$ first_name); $ query-> bindParam('last_name',$ last_name); $ query-> bindParam('primary_num',$ primary_num);

您是否尝试使用$ GLOBAL ['dbConn']而不是$ dbConn。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM