【问题标题】:Warning: mysql_fetch_array() expects parameter 1 to be resource [duplicate]警告:mysql_fetch_array() 期望参数 1 是资源 [重复]
【发布时间】:2011-08-28 07:44:50
【问题描述】:

可能重复:
mysql_fetch_array() expects parameter 1 to be resource, boolean given in select

我厌倦了看到这个错误消息任何人请帮助我; 它是一个简单的 php mysql 搜索引擎; 其中搜索元素为“adm_no”;

mY代码如下

<?php 
require_once("lib/connection.php"); 
require_once("lib/functions.php"); 
$adm_no=$_POST['adm_no'];
//if (!$adm_no==ctype_digit) echo "You Entered wrong Admission no Recheack Admission no" ; exit(); 
$clas=$_POST['clas'];
$query="SELECT * FROM $clas WHERE adm_no = $adm_no";
$result = mysql_query($query);
//searchs the query in db.
while($result = mysql_fetch_array( $result)) 
{ 
echo $result['adm_no']; 
echo " "; 
echo $result['adm_dt']; 
echo ""; 
echo $result['name']; 
echo ""; 
echo $result['dob']; 
echo " "; 
echo $result['f_name']; 
echo " "; 
echo $result['f_office']; 
echo " "; 
echo $result['f_o_no']; 
echo " "; 
echo $result['m_name']; 
echo " "; 
echo $result['m_office']; 
echo " "; 
echo $result['addr']; 
echo " "; 
} ; 

我得到的错误是

Warning: mysql_fetch_array() expects parameter 1 to be resource, array given in C:\wamp\www\st_db_1\search_db.php on line 10

我要出去了,但伴随着这个消息

【问题讨论】:

标签: php mysql


【解决方案1】:

您确实意识到while($result = mysql_fetch_array( $result)) 践踏了$result 的现有值,对吧?使用不同的变量。

【讨论】:

  • 谢谢老兄,你刚刚解决了它,但是......当我使用 $result 两次时,它应该首先刷新 $result
  • $result 是您在循环外定义的资源,并且您在循环中用数组覆盖它,因此它不再是资源。
  • @Ravi:当你从 mysql_query 设置 $result 时,它是一个 mysql 语句句柄。然后通过 mysql_fetch 在循环中用数组覆盖它。下一次,它不再是 fetch 调用的语句句柄,这是您的错误/警告的来源。
【解决方案2】:

三个问题:

  1. 你在哪里打电话mysql_connect()
  2. 您正在循环语句中覆盖$result
  3. 您的代码中有一个巨大的 SQL 注入漏洞。

【讨论】:

  • Re: #1 - 它可能在他包含/必需的文件之一中。
【解决方案3】:

RAVI,您可以通过更改此代码来修复 SQL 注入代码:

编码恐怖

$adm_no=$_POST['adm_no'];
$clas=$_POST['clas'];
$query="SELECT * FROM $clas WHERE adm_no = $adm_no";

到这个批准的代码

$allowed_tables = array('table1', 'table2'); //list of allowed tables
$clas = $_POST['clas'];
$adm_no= mysql_real_escape_string($_POST['adm_no']);
if (in_array($clas, $allowed_tables)) {
    $query="SELECT * FROM `$clas` WHERE adm_no = '$adm_no'";
//                        ^     ^ backticks      ^       ^ single quotes
}

不要忘记在表名周围添加反引号`。
更重要的是不要忘记参数周围的单引号',否则您仍然会受到攻击!

见:How does the SQL injection from the "Bobby Tables" XKCD comic work?
一般用于 SQL 注入。
并且:How to prevent SQL injection with dynamic tablenames?
用于使用动态表或字段名称时的 SQL 注入问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多