SQL查询不起作用 - 没有错误消息

时间:2010-03-23 01:51:34

标签: php sql mysql

  

删除了原始文字

好的,所以我找到了原来的问题,这要归功于一个有用的答案。 它列出了“无效查询:未选择数据库”作为错误。

require_once ('../dir_connect.php');            

$dbc = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
        if (!$dbc) {
            die('Could not connect: ' . mysql_error());
        }

如果我有这个,我在dir_connect.php文件中有这个:

/** The name of the database */
define('DB_NAME', 'unlisted_employees');

/** MySQL database username */
define('DB_USER', 'unlisted_qpass');

/** MySQL database password */
define('DB_PASSWORD', 'testpass');

/** MySQL hostname */
define('DB_HOST', 'localhost');

我是否需要添加一些内容来建立实际的数据库连接?

4 个答案:

答案 0 :(得分:4)

您需要检查mysql_query()调用的返回值。

http://php.net/manual/en/function.mysql-query.php

$result = mysql_query($query);
if (!$result) {
    die('Invalid query: ' . mysql_error());
}

现在,您将永远不会遇到错误情况,并且实际上看不到MySQL发回给您的错误(如果有)。

此外,您可能希望转义插入查询的值,而不是仅执行正常的字符串连接。如果不这样做,您的应用程序可能容易受到SQL注入攻击。以下是如何安全地生成查询:

$query = sprintf("INSERT INTO staff (name, lastname, username, password, position, department, birthmonth, birthday, birthyear, location, phone, email, street, city, state, country, zip, tags, photo) VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')",
                mysql_real_escape_string($name),
                mysql_real_escape_string($lastname),
                mysql_real_escape_string($username),
                mysql_real_escape_string($password),
                mysql_real_escape_string($position),
                mysql_real_escape_string($department),
                mysql_real_escape_string($birthmonth),
                mysql_real_escape_string($birthday),
                mysql_real_escape_string($birthyear),
                mysql_real_escape_string($location),
                mysql_real_escape_string($phone),
                mysql_real_escape_string($email),
                mysql_real_escape_string($street),
                mysql_real_escape_string($city),
                mysql_real_escape_string($state),
                mysql_real_escape_string($country),
                mysql_real_escape_string($zip),
                mysql_real_escape_string($tags),
                mysql_real_escape_string($photo));
编辑:刚看到你对另一个答案的评论。如果你已经在逃避:

$birthday = mysql_real_escape_string(trim($_POST['birthday']));

然后在生成查询时不需要转义它。在生成查询时进行转义可能是更好的做法,因此很明显您没有遗漏任何内容。

EDIT2:根据文档,mysql_connect()应该接受主机,用户和密码,然后你需要做一个mysql_select_db()调用,然后选择正确的数据库。

http://www.php.net/manual/en/function.mysql-select-db.php

$dbc = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);
if (!$dbc) {
    die('Could not connect: ' . mysql_error());
}

// make foo the current db
$db_selected = mysql_select_db(DB_NAME, $dbc);
if (!$db_selected) {
    die ('Could not select database: ' . mysql_error());
}

(顺便说一下,你应该编辑你的问题并放回原始文本,这样以后可能对其他人有用了!)

答案 1 :(得分:0)

您应该使用类似mysql_real_escape_string(或任何适合您的数据库引擎的内容)来逃避查询中的参数。查看我链接到的文档。自从我使用PHP以来已经有一段时间了,但有人可能会使用更好的参数化转义方法。

但是,你的主要问题似乎是你在整数字段中插入字符串。检查你的zip,birthmonth,birthday,birthyear等字段的值...他们可能不需要用单引号转义。

祝你好运!

答案 2 :(得分:0)

没有与数据库的连接?

mysql_query()失败时返回false并生成警告,而不是错误。

顺便说一下,!$query并没有告诉你任何关于mysql的事情,因为它只是一个文本字符串。

答案 3 :(得分:0)

问题在于:

if (!$query) {
    die('Invalid query: ' . mysql_error());
}

您正在检查$query变量以确定查询是否运行,这没有任何意义。相反,您需要收集mysql_query的返回值,然后再使用它。

$res = mysql_query($query);
if (!$res) {
    die('Invalid query: ' . mysql_error());
}