2012-10-19 39 views
-1

Possible Duplicate:
mysql_fetch_array() expects parameter 1 to be resource, boolean given in select
mysql_fetch_assoc() expects parameter 1 to be resourcePHP mysql_fetch_assoc错误

我试图从一个表中提取单个字段,并将其添加到另一个。

这是我第三天使用MySQL/PHP,所以我有一个小问题。
PHP抛出一个错误,期望一个资源但给出一个字符串。
这是一个表中自动递增的ID字段。

基本上,我拉的名字和姓氏匹配的ID。

$query5 = "SELECT FROM ".$db_prefix."customer_det (`id`) 
WHERE fname = '".$fname."' 
AND lname = '".$lname."'"; 

$result5 = mysql_query($query5); 
while($row = mysql_fetch_assoc($result5)){ 
$uid = $row['id']; 
echo "$uid"; 
} 

错误:

Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given

+1

请使用['mysqli_ *'](http://php.net/mysqli)函数或[PDO ](http://php.net/PDO)而不是'mysql_ *'函数。 – nkr

+0

它引发警告:mysql_fetch_assoc()期望参数1是资源,现在给出的布尔值 – smada

+0

这是可怕的代码,并会打开你的SQL注入攻击。请使用相当于PHP中预准备语句的任何内容。 – R0MANARMY

回答

0

我要去猜测,引发错误的行是这一个:

while($row = mysql_fetch_assoc($result5)){ 

功能mysql_fetch_assoc是“期待一个资源”中,你需要通过它的结果SQL查询,它将从这些结果中获取。然而,$result5不是SQL查询,这是一个字符串:

$result5 = "mysql_query($query5)"; 

我不知道为什么你把引号解决这个问题,但如果你想真正拥有这些代码是你不想让他们有解释:

$result5 = mysql_query($query5); 

这将运行mysql_query功能和它的返回值(这是一种资源)放入$result5


现在有更重要的东西...

首先,你的代码是SQL injection attacks敞开的。关于这一点还有很多需要知道的事情,单个Stack Overflow答案不会涵盖它。所以我会试着总结一下这个概念,只是说你永远不应该使用使用用户输入值的原始字符串连接来构建一个SQL查询。用户可以输入恶意输入并修改查询,从而有效地访问数据库。如果数据库以提升的权限运行,那么他们可以访问服务器上的更多内容,依此类推。

基本上,总是净化你的输入从不隐信任输入来自用户

二,不要使用mysql_函数。它们已经被mysqli_函数取代,原因并不完全与我刚才提到的SQL注入无关。 The documentation page for them even very clearly states this

+0

David我欣赏所有信息。一旦引号被移除,它仍然会抛出错误。 – smada

+0

@ user1718270:SQL查询中是否发生错误,导致不会返回有效的资源?你可以使用'mysql_error'从数据库中获取错误信息:http://php.net/manual/en/mysqli.error.php – David

+0

@ user1718270:我刚刚注意到......你实际上并没有选择任何东西在你的SQL查询。问题出在SQL代码中,而不是PHP代码。注意你直接从'select'到'from',而不指定你选择的内容。如果您想从该表中选择所有内容,请使用:'select * from' – David

4
$result5 = "mysql_query($query5)"; 
     ^    ^

删除引号。

如果您使用var_dump($result5);,您会得到它是string。原因是在双引号或单引号中的所有内容都被视为字符串。

你也需要处理这样的错误:

$result5 = mysql_query($query5) or die(mysql_error()); 

因为mysql_query将失败

返回false如果你有兴趣的字符串表示看一看manual

此外,您的查询中有语法错误。你缺少你想从数据库中检索某些列:

$query5 = "select from ".$db_prefix."customer_det (`id`) where fname = '".$fname."' and lname = '".$lname."'"; 
       ^

select

注意添加*(列或名称):mysql_*功能已被弃用。替代方案是:mysqli_*PDO

+0

你必须在开玩笑...语法正在杀死我。它仍然抛出相同的错误。 – smada

+0

只是为了澄清小巴的一点。 引号中的所有内容都被视为一个字符串,但是,使用双引号内的变量将为您提供值,而不是变量名称。这是因为对双引号内的变量进行评估。 另一方面,单引号不会这样做,因此使用起来更快。 –

+0

@ user1718270查看更新后的答案。你需要检查发生了什么错误。 – Leri

1
$query5 = "select from ".$db_prefix."customer_det (`id`) where fname = '".$fname."' and lname = '".$lname."'"; 
$result5 = mysql_query($query5); 
while($row = mysql_fetch_assoc($result5)){ 
    $uid = $row['id']; 
    echo "$uid"; 
} 
0

Change--

$result5 = "mysql_query($query5)"; 

TO

$result5 = mysql_query($query5); 
0

使用此

$result5 = mysql_query($query5); 

取而代之的是

$result5 = "mysql_query($query5)"; 
0

你缺少从查询所选字段(id)名称:

$query = "SELECT id FROM {$db_prefix}customer_det WHERE fname = '{$fname}' AND lname = '{$lname}'"; 
$result = mysql_query($query); 
while($row = mysql_fetch_assoc($result)){ 
    echo $row['id']; 
} 
相关问题