PHP MySQLi插入不起作用,没有错误

5
这个问题不同,但是在添加信息到我的数据库时没有错误提示。
$sql = "INSERT INTO 'nlcc_ver1'.'tUsers' ('userID', 'userName', 'userPassword', 'userHash',
'user_first_name', 'user_last_name', 'user_corps', 'is_admin', 'is_trg', 'is_sup', 'is_co')
VALUES (NULL, '" . $userName . "', '" . $hash . "', '" . $salt . "', '" . $f_name . "', '" .
$l_name . "', '" . $corps . "', '" . $admin . "', '" . $trg . "', '" . $sup . "', '" . $co . "')";
$hostname_Database = "localhost";
$database_Database = "nlcc_ver1";
$username_Database = "root";
$password_Database = "";
$mysqli = new mysqli($hostname_Database, $username_Database, $password_Database, $database_Database); 
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$result = $mysqli_query($mysqli, $sql);
echo "Query run. Inserted UserID " . mysqli_insert_id($mysqli) . "<br />";

为了避免横向滚动,插入换行符...网页上显示mysqli_insert_id($mysqli)的值为0,在我的数据库中没有添加任何内容。我没有看到连接数据库时出现错误,并且MySQL正在我的服务器上运行,phpinfo()显示MySQL和MySQLI扩展都已加载。这只是一台开发机器,所以不用担心安全性(即没有密码)。我尝试过在Google上搜索此问题,但没有找到太多信息。我不知道有关面向对象PHP编程的->,我习惯使用_。这种方法仍然受支持吗?

2
你怎么知道没有错误?你从未在查询中实际检查过任何错误。 - Lightness Races in Orbit
@Tomalak:我在 Navicat 中打开了数据库,并点击了刷新按钮。但是它没有改变。 - Canadian Luke
1
@CJBarone:什么?什么没有改变?你仍然没有在查询中进行任何错误检查的事实没有改变。 - Lightness Races in Orbit
@Tomalak 我应该做什么类型的错误检查?我在每几行之后都有调试回显,输出应该出现的内容,而且我打开了 Navicat,显示我的表格。 - Canadian Luke
@CJBarone:你没有对$result进行任何检查。我的答案展示了如何检查查询错误。 - Lightness Races in Orbit
显示剩余2条评论
4个回答

15
您已经混合了程序化和面向对象的MySQLi风格。这导致您尝试使用函数,例如mysqli_query($mysqli)而不是成员函数$mysqli->query()。 您的$mysqli是一个对象,而不是资源句柄。
此外,您没有对查询进行任何错误检查。如果有的话,您会发现自己错误地使用单引号来定界表和字段名,而不是反引号。
$sql = "INSERT INTO `nlcc_ver1`.`tUsers`
       (`userID`, `userName`, `userPassword`, `userHash`,
        `user_first_name`, `user_last_name`, `user_corps`,
        `is_admin`, `is_trg`, `is_sup`, `is_co`)
       VALUES (NULL, '" . $userName . "', '" . $hash . "', '" . $salt . "', '" .
               $f_name . "', '" . $l_name . "', '" . $corps . "', '" . $admin .
               "', '" . $trg . "', '" . $sup . "', '" . $co . "')";

$hostname_Database = "localhost";
$database_Database = "nlcc_ver1";
$username_Database = "root";
$password_Database = "";

$mysqli = new mysqli($hostname_Database, $username_Database, $password_Database, $database_Database); 
if (mysqli_connect_errno()) {
   printf("Connect failed: %s\n", mysqli_connect_error());
   exit();
}

$result = $mysqli->query($sql);
if (!$result) {
   printf("%s\n", $mysqli->error);
   exit();
}

echo "Query run. Inserted UserID " . $mysqli->insert_id . "<br />";

我强烈建议您使用手册作为参考。当您使用过程式或面向对象的MySQLi时,它非常清楚地说明了如何使用这些函数。


这个有效!你忘记在userName后面改变一个撇号,我还不能编辑它。不过还是谢谢你 :) - Canadian Luke
真的吗?在哪里?很高兴你解决了它;你明白其中的道理吗? - Lightness Races in Orbit
@CJBarone:你应该买一本像样的、最新的PHP书,而不是一些由地下室里的青春痘少年写的PDF! :) - Lightness Races in Orbit
可以做...有什么推荐吗?我曾经有一本叫做《PHP和MySQL编程:第二版》的书,但是像我说的那样,那是几年前的事情了,而且教授的是过程式编程,不是面向对象编程。 - Canadian Luke
1
http://stackoverflow.com/questions/249835/book-recommendation-for-learning-good-php-oop - Lightness Races in Orbit
显示剩余5条评论

4
$mysqli_query($mysqli, $sql);

应该是

mysqli_query($mysqli, $sql);

或者

$mysqli->query($sql);

接下来,

$mysqli->insert_id();

不,他没有使用过程式风格(至少不是一贯地)。 - Lightness Races in Orbit

2

看这个:

'nlcc_ver1'.'tUsers'

在这里您必须使用反引号作为引用字符:

`nlcc_ver1`.`tUsers`

但是(假设在$mysqli_query中的$只是一个打字错误):除非在执行查询后立即使用mysqli_error(),否则您不会收到关于查询的错误信息。


我以前从未使用过反引号... 我制作的所有其他 PHP 网站(我已经有几年没有使用 PHP 了)都使用 " 和 '。我下载了一份关于 PHP 中面向对象编程的 PDF,也许那会更好地解释它。 - Canadian Luke
不需要引用标识符,如表名,但如果您决定这样做,唯一的引号字符是反引号。 - Dr.Molle

0
在插入之前设置AutoCommit = 1。
$mysqli->query('SET AUTOCOMMIT = 1');

谢谢您的回答,但这个项目已经夭折了。还是非常感谢您提供帮助! - Canadian Luke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接