在数据库中替换表后,查询未在PHP预处理语句中执行

时间:2017-03-12 00:24:48

标签: php mysqli prepared-statement

编辑:这被标记为this问题的副本:“在我的LOCAL / DEV环境中,mysqli查询执行正常。但是,当我在WEBHOST上传它时环境,我收到了这个错误..“ 我还没有搬到现场虚拟主机。这仅在本地主机上,问题是在更换数据库中的之后。它没有任何关系。

我使用了一个关于在PHP中创建一个小型会话数据库的教程,但是,它是从近8年前开始使用的,并使用了不推荐使用的mysql *函数。我也意识到这些表没有外键,我需要它。即使数据正确插入数据库,我也想改变结构。我删除了原始表并使用外键创建了新表。

我正在使用预处理语句,在创建新表之后,我的PHP中不同的唯一是表和字段名称。没有其他改变。问题是没有任何东西被INSERTED进入数据库,我没有得到任何错误。如果我直接在PhpMyAdmin中运行查询,以及PHPStorm中的数据库控制台,则会插入数据。

我错过了什么吗?我真的进入了代码并编辑了INSERT查询的表/属性名称。就这样。以下是查询(注意:此文件可从其他页面访问):

 if (isset($_POST['subject'], $_POST['msg_body']) && !empty($_POST['subject']) && !empty($_POST['msg_body'])) {

    include('connect.php');

    //Grab POST vars
    $recipient_name = $_GET['username'];
    $sender_name = $_SESSION['username'];
    $user_1_status = 0;
    $user_2_status = 0;
    $msg_subject = htmlentities($_POST['subject']);
    $msg_body = htmlentities($_POST['msg_body']);
    $sender_id = "";
    $recipient_id = "";
    $conversation_id = mysqli_insert_id($connection);
    echo json_encode(array("Server sent back" =>$msg_subject, $msg_body)); //For debugging

    //GET IDs OF SENDER and RECIPIENT
    $query = "SELECT * FROM `users` WHERE username=? OR username=?";
    if(!$stmt = $connection->prepare($query)) {
        echo $stmt->error;
    } else {
        if(!$stmt->bind_param('ss', $sender_name, $recipient_name)) {
            echo $stmt->error;
        } else {
            $stmt->execute();
        }
    }
    $result = $stmt->get_result();
    while($row = $result->fetch_assoc()) {
        if($row['username'] == $sender_name) {
            $sender_id = $row['id'];
            $sender_name = $row['username'];
        } else {
            $recipient_id = $row['id'];
            $recipient_name = $row['username'];
        }
    }
    $stmt->close();

    $query = "INSERT INTO `conversation` (conversation_subject, user_1, user_2, time, user_1_status, user_2_status)
              VALUES (?, ?, ?, CURRENT_TIMESTAMP(), ?, ?)";
    if(!$stmt=$connection->prepare($query)) {
        echo $stmt->error;

    } else {
        if(!$stmt->bind_param('siiii', $msg_subject, $sender_id, $recipient_id, $user_1_status, $user_2_status)) {
            echo $stmt->error;
        } else {
            $stmt->execute();
            $stmt->close();
            $connection->close();
        }
    }
 }

原始表是直接在PhpMyAdmin GUI中创建的。我继续通过代码创建了新的代码:

 include_once("../inc/connect.php");
$table_conversation = "CREATE TABLE IF NOT EXISTS conversation(
                       conversation_id int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
                       conversation_subject varchar(128),
                       user_1 int(11) NOT NULL,
                       user_2 int(11) NOT NULL,
                       time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP() ON UPDATE CURRENT_TIMESTAMP(),
                       user_1_status int(1) NOT NULL,
                       user_2_status int(1) NOT NULL,
                       FOREIGN KEY (user_1) REFERENCES users(id),
                       FOREIGN KEY (user_2) REFERENCES users(id))";

$query = mysqli_query($connection, $table_conversation);
if($query === TRUE) {
    echo "<h3>Conversation Table created</h3>";
} else {
    echo "<h3>Conversation Table <strong>not</strong> created</h3>";
    printf("Error code: %d<br/>", mysqli_errno($connection));
    echo ("Error description: " . mysqli_error($connection));
}

$table_reply = "CREATE TABLE IF NOT EXISTS conversation_reply(
                reply_id int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
                reply text,
                user_id_fk int(11) NOT NULL,
                time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP() ON UPDATE CURRENT_TIMESTAMP(),
                conversation_id_fk int(11) NOT NULL,
                FOREIGN KEY (user_id_fk) REFERENCES users(id),
                FOREIGN KEY (conversation_id_fk) REFERENCES conversation(conversation_id))";

$query = mysqli_query($connection, $table_reply);
if($query === TRUE) {
    echo "<h3>Reply Table created</h3>";
} else {
    echo "<h3>Reply Table <strong>not</strong> created</h3>";
    printf("Error code: %d<br/>", mysqli_errno($connection));
    echo("Error description: " . mysqli_error($connection));
}

以下是PHPStorm中数据库控制台的示例查询:

INSERT INTO conversation (conversation_subject, user_1, user_2, time, user_1_status, user_2_status)
VALUES ("Hello", "1", "11", CURRENT_TIMESTAMP(), "0", "0");

它显示在控制台和数据库本身中:

Query Result

如果除了创建表的方式,添加外键以及准备语句中表/字段的名称之外没有任何更改,我缺少什么?

我尝试了什么:

我在我的文件顶部有这个:

<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
mysqli_report(MYSQLI_REPORT_ALL);

我尝试将其添加到我的执行语句中:

if(!$stmt3->execute()) { //same for all the others ($stmt, $stmt2, etc)
    echo $stmt3->error;
}

我尝试查看其他问题,但我觉得我的案例是独特的,因为它在创建新表之前有效。

1 个答案:

答案 0 :(得分:0)

我发现this SO post解释了

时MySQL错误报告的行为
mysqli_report(MYSQLI_REPORT_ALL)

包括在内。所以,我把它改成了

 mysqli_report(MYSQLI_REPORT_OFF)

现在,我的网络选项卡中没有更多错误,并且查询正确执行。

DB Row

我还不知道为什么在更改我的表结构后发生了这种情况,但我认为这与我没有用新表设置索引这一事实有关。

虽然评论没有回答我的问题,但感谢建议更好的错误报告方法。现在我终于可以继续前进! : - )