我在PHP代码中不断收到“Error Querying Database”

时间:2016-02-06 04:36:47

标签: php mysql mysqli

看起来我正好连接到服务器。运行查询时似乎发生了这个问题。它一直在说

  

查询数据库时出错

这是我的代码:

 <?php
 $dbc = mysqli_connect('localhost', 'elvis_store')
      or die('Error connecting to MySQL server.');

 $first_name = $_POST['firstname'];
 $last_name = $_POST['lastname'];
 $email = $_POST['email'];

 $query = "INSERT INTO email_list (first_name, last_name, email)" .
      "VALUES ('$first_name', '$last_name', '$email')";
 mysqli_query($dbc, $query)
      or die('Error querying database.');

 echo 'Customer added.';

 mysqli_close($dbc);
 ?>

2 个答案:

答案 0 :(得分:2)

您收到此错误,因为在您的MySQLi连接中,您只提供位置和用户名。您没有提供要使用的数据库名称。如果您没有密码,则需要按如下方式编写连接:

$dbc = mysqli_connect('localhost', 'elvis_store', NULL, 'dbName)

$dbc = mysqli_connect('localhost', 'dbUsername', NULL, 'elvis_store')

如果&#34; elvis_store&#34;是数据库名称而不是用户名。请记住,mysqli连接是:mysqli_connect(dbLocation, dbUsername, dbPassword, dbName)

另外,正如Ed在另一个答案中指出的那样,MySQL语句中也存在语法错误。以下是Ed的回答:

$query = "INSERT INTO email_list (first_name, last_name, email) " . "VALUES ('$first_name', '$last_name', '$email')";

答案 1 :(得分:0)

你有很多问题。

问题1:语法错误

您的查询有拼写错误(缺少空格)。您的查询代码

$query = "INSERT INTO email_list (first_name, last_name, email)" .
 "VALUES ('$first_name', '$last_name', '$email')";

生成此查询:

INSERT INTO email_list (first_name, last_name, email)VALUES ('$first_name', '$last_name', '$email')
--                                                   ^ syntax error, missing space

要解决此问题,请将代码更改为:

$query = "INSERT INTO email_list (first_name, last_name, email) " .
 "VALUES ('$first_name', '$last_name', '$email')";

至少出于测试目的,您可能应该查看mysqli_error()的输出,而不是使用Error querying database之类的通用消息。即使在生产中,您也希望以某种方式陷入并记录真实的错误

问题2:您没有选择数据库

编辑:我在第一眼看到您的问题时错过了这个,但正如Stephen Cioffi指出的那样,您还需要在运行查询之前选择一个数据库。您可以使用mysqli_connect()的架构参数或使用mysqli_db_select()

执行此操作

这两个问题 - 错字和选择数据库的失败 - 都会导致问题;你必须解决这两个问题。

问题3:巨大的SQL注入漏洞

这不是答案的严格部分,但重要的是。您对SQL injection持开放态度。您需要使用预准备语句。否则,你将被黑客入侵。想象一下,POST firstname就是这样:

', (SELECT CONCAT(username, ',', password) FROM users WHERE is_admin = 1), 'eviluser@example.com') -- 

您的查询变为(带有一些添加的格式):

INSERT INTO email_list (first_name, last_name, email)
VALUES ('',
    (SELECT CONCAT(username, ',', password) FROM users WHERE is_admin = 1),
    'eviluser@example.com'
) -- ', 'value of lastname', 'value of email')

然后,当您向用户发送电子邮件时,有人会收到一封收件人的电子邮件,如

"Duke,mySup3rP@ssw0rd!" <eviluser@example.com>

而且......你被软管了。

(希望你正在腌制和散列密码,但这仍然是灾难性的。)你必须使用准备好的陈述。