编辑:这被标记为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");
它显示在控制台和数据库本身中:
如果除了创建表的方式,添加外键以及准备语句中表/字段的名称之外没有任何更改,我缺少什么?
我尝试了什么:
我在我的文件顶部有这个:
<?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;
}
我尝试查看其他问题,但我觉得我的案例是独特的,因为它在创建新表之前有效。
答案 0 :(得分:0)
我发现this SO post解释了
时MySQL错误报告的行为mysqli_report(MYSQLI_REPORT_ALL)
包括在内。所以,我把它改成了
mysqli_report(MYSQLI_REPORT_OFF)
现在,我的网络选项卡中没有更多错误,并且查询正确执行。
我还不知道为什么在更改我的表结构后发生了这种情况,但我认为这与我没有用新表设置索引这一事实有关。
虽然评论没有回答我的问题,但感谢建议更好的错误报告方法。现在我终于可以继续前进! : - )