php - 在 php 代码中使用“INSERT INTO”语句不起作用
问题描述
我正在尝试为具有 3 个表的书店构建数据库:Book、Volume 和 Publication。我正在使用 mysqli() 并且代码既不工作也不回显任何错误。
<?php
//connect to db
$conn = new mysqli("localhost", "root", "", "ershadbookstore");
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
#new recoed: if the new record is inserted into book successfully, another new record is inserted into volume table. the same goes for volume and phblication table. at the end the total number of this volumn is editted in the rows with the same isbn.
$sql = "INSERT INTO Book (name, vnum, writer, translator, publisher, genre, format)
VALUES ('test', 'test', 'test', 'test', 'test', 'test', 'test')";
if ($conn->query($sql) === TRUE) {
$last_bid = $conn->insert_id;
$sql = "INSERT INTO Volume (isbn, bid, vnum, note, image)
VALUES ('test', 'test', 'test', 'test', 'test')";
if ($conn->query($sql) === TRUE) {
$sql = "INSERT INTO Publication (isbn, pubnum, pyear, circulation, fpyear, pnum, price, num)
VALUES ('test', 'test', 'test', 'test', 'test', 'test', 'test', 'test')";
if ($conn->query($sql) === TRUE) {
$sql= "SELECT SUM(num) FROM Publication
WHERE (isbn='test')";
if ($conn->query($sql) === TRUE) {
$totalNum=$conn->query($sql);
$sql1= "UPDATE Volume
SET (tnum = test)
WHERE (isbn= test)";
if ($conn->query($sql1) === TRUE)
{
echo "true";
}
else
{
return "Error publication table: " . $sql1 . "<br>" . $conn->error;
}
}
}
else{
return "Error publication table: " . $sql . "<br>" . $conn->error;
}
}
else {
return "Error for volume table: " . $sql . "<br>" . $conn->error;
}
}
else {
return "Error for book table: " . $sql . "<br>" . $conn->error;
}
$conn->close();
?>
解决方案
问题是您正在检查=== TRUE
.
正如 PHP 手册所说:
失败时返回 FALSE。对于成功的 SELECT、SHOW、DESCRIBE 或 EXPLAIN 查询,mysqli_query() 将返回一个 mysqli_result 对象。对于其他成功的查询,mysqli_query() 将返回 TRUE。
虽然您的错误检查适用于 INSERT 或 UPDATE 查询,但 SELECT 查询不会返回 true。事实上,像这样检查布尔值是完全没有必要的。
删除检查=== TRUE
,您的代码应该可以正常工作。
$sql= "SELECT SUM(num) FROM Publication
WHERE isbn='test'";
if ($conn->query($sql)) { // removed === TRUE
$sql1= "UPDATE Volume
SET tnum = 'test'
WHERE isbn= 'test'";
if ($conn->query($sql1))
{
echo "true";
}
else
{
return "Error publication table: " . $sql1 . "<br>" . $conn->error;
}
}
如果启用mysqli 错误报告,则不需要任何if
语句,这将使您的代码更简单:
$sql = "SELECT SUM(num) FROM Publication
WHERE isbn='test'";
$conn->query($sql);
$sql1 = "UPDATE Volume
SET tnum = 'test'
WHERE isbn= 'test'";
$conn->query($sql1);
echo "true";
此外,您在上次更新查询中的值缺少引号。
SET (tnum = 'test')
WHERE (isbn= 'test')";
此外,无需执行两次 SELECT 查询即可获取值。您应该重构您的代码,以便$totalNum=$conn->query($sql);
不需要第二个查询 ( )。
推荐阅读
- node.js - 在heroku Nodejs PHP项目上部署socket io ws服务器失败
- python - 遍历一个numpy数组并调用一个方法
- javascript - React:如何制作可注册的动态导航菜单项?
- arrays - Systemverilog:动态数组的大小是否有限制?
- bash - 如何等待命令完成 - gcloud config 配置激活
- python - 无需以超级用户身份登录即可访问和修改 Django DB
- computer-science - L = {a^na^nb^m |m, n ≥ 0} 是规则语言还是不规则语言?
- python - Python中的类方法更新整个类而不是单个对象
- java - Android:受保护的无效 onCreate(捆绑保存的实例状态)错误
- c++ - 我的 C++ 模板类中的 begin() 方法出现问题