2010-03-23 40 views
1

原始文本中删除SQL查询不能正常运行 - 没有错误消息

好了,我才发现,原来多亏有帮助的答案的问题。 它列出“无效的查询:没有选择数据库”作为错误。

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'); 

有什么我需要添加到您的实际的数据库连接?

+1

您错过了参数化查询,有一件事... – Aaronaught 2010-03-23 01:56:21

回答

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'])); 

那么您在生成查询时不需要转义它。在生成查询时进行转义可能是更好的做法,因此显然你不会错过任何东西。

编辑2:根据文档,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()); 
} 

(顺便说一句,你应该修改你的问题,并放回原来的文本,所以可能是其他后来发现这个话题有用!)

+0

无效的查询:No selected selected 糟糕?我会仔细检查发生的情况。 – 2010-03-23 02:07:58

0

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

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

祝你好运!

+0

谢谢!我会仔细研究这一点。我不确定我是否明白它是如何工作的。我是这个escape_string的新手,但是我在上面这样使用它; $ birthday = mysql_real_escape_string(trim($ _ POST ['birthday'])); 有没有更好的方法来做到这一点? – 2010-03-23 02:03:51

0

没有连接到数据库?

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

顺便说一句,!$query不会告诉你任何事情,只要是mysql,因为它只是一个文本字符串。

0

的问题是在这里:

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

正在检查的$query变量来决定,如果查询运行与否,这是没有意义的。相反,您需要收集mysql_query的返回值,然后改为使用它。

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