【问题标题】:PHP SQL string assignment throws a server errorPHP SQL 字符串赋值引发服务器错误
【发布时间】:2015-06-21 18:17:15
【问题描述】:

我第一次尝试让 PHP 连接到 Apache 服务器上的 MySQL 数据库。下面是我正在使用的简单 PHP 代码。

 <?php
// To ensure that the $_POST superglobal is accessible.
print_r($_POST);
print_r($_POST['usertype']);

$db = mysqli_connect("localhost", "root", "", "rental_26349188");
if (mysqli_connect_errno()) {
  mysqli_connect_error();
  exit;
}

$sql = "INSERT INTO user_information (usertype, firstname, lastname, phonenumber, email, loginname, password) VALUES (".$_POST['usertype'].", ".$_POST['firstname'].", ".$_POST['lastname'].", ".$_POST['phonenumber'].", ".$_POST['email'].", ".$_POST['loginname'].", ".$_POST['password'].");"

mysqli_query($db, $sql);

mysqli_close($db); 
?>

数据库表之前是使用以下 SQL 命令创建的:

CREATE TABLE IF NOT EXISTS `user_information` (   `id` int(255) NOT NULL,   `usertype` varchar(255) NOT NULL,   `firstname` varchar(255) NOT NULL,   `lastname` varchar(255) NOT NULL,   `phonenumber` varchar(255) NOT NULL,   `email` varchar(255) NOT NULL,   `loginname` varchar(255) NOT NULL,   `password` varchar(255) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ALTER TABLE `user_information`   ADD PRIMARY KEY (`id`);

ALTER TABLE `user_information`   MODIFY `id` int(255) NOT NULL AUTO_INCREMENT;

我在加载页面时收到以下错误。

奇怪的是,我发现注释掉 PHP 代码中的 $sqlmysqli_query 行可以避免引发错误。我还尝试以面向对象的方式编写mysqli 命令,以及将$_POST['key'] 内容插入到带有大括号替换的字符串中(即{$_POST['key']}),所有这些都产生了相同的结果.很明显,PHP 能够访问数据库,因为它可以连接并关闭它。

为什么将 SQL 字符串赋值给 PHP 变量会导致内部服务器 500 错误?如何更正我的代码以免产生错误?

【问题讨论】:

  • 您需要在插入查询中将值用单引号括起来。
  • 您的服务器上是否启用了 MySQLi?
  • 为了避免引用变量时引入的sql注入问题,确实需要切换到prepared statement。
  • 顺便问一下,你确定你已经用root替换了mysql的标准asmin用户吗?如果您可以使用该帐户手动访问 mysql 终端进行连接并检查它是否正常工作。

标签: php mysql string mysqli server


【解决方案1】:

响应 500 Internal Error 通常表示编译问题,例如脚本中的语法错误。

关于你的脚本,行

$sql = "INSERT INTO user_information ... .$_POST['password'].");"

不以分号 (;) 结尾(或者您将其放在字符串中)。在行尾添加,状态码500就会消失。

【讨论】:

  • 这个答案是我的问题的解决方案:我只是错过了该语句末尾的分号。谢谢。
  • 但是,请考虑您在 cmets 中收到的良好建议。不要通过字符串连接构造 SQL 查询。使用prepared statements。它们更安全,更不容易出错。
【解决方案2】:

我没有看到你在任何地方使用“'”作为值 - 你确定没有一个值有空格吗? 同样以这种方式使用直接用户输入到 SQL 查询中也不是一个好主意,因为它允许 sql 注入。 MySQL 具有 bindParam 机制,这使其安全 - 我强烈建议查看它的文档。 我知道我的笔记与当前的问题相去甚远,但是因为您告诉它首先是您与 MySQl 的接触,所以我让自己去做。 问候

【讨论】:

    【解决方案3】:

    试试:

    $db = mysqli_connect("localhost", "root", "", "rental_26349188");
    if (mysqli_connect_errno()) {
      echo "Failed to connect to MySQL: " . mysqli_connect_error();
      exit;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-25
      • 1970-01-01
      • 2015-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-22
      • 1970-01-01
      相关资源
      最近更新 更多