mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows etc… expects parameter 1 to be resource or result
我试图从MySQL表中选择数据,但收到以下错误消息之一:
mysql_fetch_array() expects parameter 1 to be resource, boolean given
或
mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given
或
Call to a member function fetch_array() on boolean / non-object
这是我的代码:
1 2 3 4 5 6 7 8 | $username = $_POST['username']; $password = $_POST['password']; $result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username'); while($row = mysql_fetch_array($result)) { echo $row['FirstName']; } |
同样适用于类似代码
1 2 3 4 | $result = mysqli_query($mysqli, 'SELECT ...'); // mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given while( $row=mysqli_fetch_array($result) ) { ... |
和
1 2 3 4 | $result = $mysqli->query($mysqli, 'SELECT ...'); // Call to a member function fetch_assoc() on a non-object while( $row=$result->fetch_assoc($result) ) { ... |
和
1 2 3 4 | $result = $pdo->query('SELECT ...', PDO::FETCH_ASSOC); // Invalid argument supplied for foreach() foreach( $result as $row ) { ... |
和
1 2 3 | $stmt = $mysqli->prepare('SELECT ...'); // Call to a member function bind_param() on a non-object $stmt->bind_param(...); |
和
1 2 3 | $stmt = $pdo->prepare('SELECT ...'); // Call to a member function bindParam() on a non-object $stmt->bindParam(...); |
查询可能由于各种原因失败,在这种情况下,mysql_u*和mysqli扩展将从各自的查询功能/方法返回
MySQL扩展名:
NOTE The mysql_ functions are deprecated and have been removed in php version 7.
交给
1 2 3 4 5 6 7 8 9 10 11 12 | $username = mysql_real_escape_string($_POST['username']); $password = $_POST['password']; $result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '$username'"); if($result === FALSE) { die(mysql_error()); // TODO: better error handling } while($row = mysql_fetch_array($result)) { echo $row['FirstName']; } |
mysqli扩展程序样式:
1 2 3 4 5 6 7 8 9 10 11 | $username = mysqli_real_escape_string($mysqli, $_POST['username']); $result = mysqli_query($mysqli,"SELECT * FROM Users WHERE UserName LIKE '$username'"); // mysqli_query returns false if something went wrong with the query if($result === FALSE) { yourErrorHandler(mysqli_error($mysqli)); } else { // as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach foreach( $result as $row ) { ... |
OO风格:
1 2 3 4 5 6 7 8 9 10 | $username = $mysqli->escape_string($_POST['username']); $result = $mysqli->query("SELECT * FROM Users WHERE UserName LIKE '$username'"); if($result === FALSE) { yourErrorHandler($mysqli->error); // or $mysqli->error_list } else { // as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach foreach( $result as $row ) { ... |
使用准备好的语句:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | $stmt = $mysqli->prepare('SELECT * FROM Users WHERE UserName LIKE ?'); if ( !$stmt ) { yourErrorHandler($mysqli->error); // or $mysqli->error_list } else if ( !$stmt->bind_param('s', $_POST['username']) ) { yourErrorHandler($stmt->error); // or $stmt->error_list } else if ( !$stmt->execute() ) { yourErrorHandler($stmt->error); // or $stmt->error_list } else { $result = $stmt->get_result(); // as of php 5.4 mysqli_result implements Traversable, so you can use it with foreach foreach( $result as $row ) { ... |
这些示例只说明应该做什么(错误处理),而不是如何做。生产代码在输出HTML时不应该使用
当您的查询中出现导致失败的错误时,将显示此错误消息。它将在使用时显示出来:
mysql_fetch_array /mysqli_fetch_array() 。mysql_fetch_assoc() /mysqli_fetch_assoc() 。mysql_num_rows() /mysqli_num_rows() 。
注意:如果查询不影响任何行,则不会出现此错误。只有具有无效语法的查询才会生成此错误。
故障排除步骤
确保将开发服务器配置为显示所有错误。您可以通过将它放在文件的顶部或配置文件:
error_reporting(-1); 中来完成此操作。如果您有任何语法错误,这将向您指出它们。使用
mysql_error() 。mysql_error() 将报告MySQL在执行查询时遇到的任何错误。样品使用情况:
1
2
3
4
5
6
7
8
9mysql_connect($host, $username, $password) or die("cannot connect");
mysql_select_db($db_name) or die("cannot select DB");
$sql ="SELECT * FROM table_name";
$result = mysql_query($sql);
if (false === $result) {
echo mysql_error();
}从mysql命令行或phpmyadmin等工具运行查询。如果您的查询中有语法错误,这将告诉您它是什么。
确保你的报价是正确的。查询或值周围缺少引号可能会导致查询失败。
确保你在逃避你的价值观。查询中的引号可能会导致查询失败(也会使您对SQL注入保持开放状态)。使用
mysql_real_escape_string() 来逃避您的输入。确保没有混合
mysqli_* 和mysql_* 功能。它们不是一回事,不能一起使用。(如果你要选择其中一个或另一个坚持与mysqli_* 。原因见下文。)
其他提示
新代码不应使用
这里出现的错误是由于使用了单引号(
1 2 3 4 5 | mysql_query(" SELECT * FROM Users WHERE UserName LIKE '".mysql_real_escape_string ($username)."' "); |
它使用
正如scompt.com解释的那样,查询可能会失败。使用此代码获取查询的错误或正确的结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | $username = $_POST['username']; $password = $_POST['password']; $result = mysql_query(" SELECT * FROM Users WHERE UserName LIKE '".mysql_real_escape_string($username)."' "); if($result) { while($row = mysql_fetch_array($result)) { echo $row['FirstName']; } } else { echo 'Invalid query: ' . mysql_error() ." "; echo 'Whole query: ' . $query; } |
有关更多信息,请参阅
实际错误是单引号,因此无法分析变量
在
1 |
另外,如果不使用通配符,那么使用
请检查选择的数据库是否不是因为某些时候未选择数据库
检查
1 |
MySQL查询前然后进入下一步
1 2 3 4 | $result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username'); f($result === FALSE) { die(mysql_error()); |
你的代码应该是这样的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | $username = $_POST['username']; $password = $_POST['password']; $query ="SELECT * FROM Users WHERE UserName LIKE '$username'"; echo $query; $result = mysql_query($query); if($result === FALSE) { die(mysql_error("error message for the user")); } while($row = mysql_fetch_array($result)) { echo $row['FirstName']; } |
完成后,您将在屏幕上打印查询。在服务器上尝试此查询,看看它是否产生所需的结果。大多数情况下,错误出现在查询中。其余代码是正确的。
1 |
使用单引号定义字符串,而php不解析单引号分隔的字符串。为了获得变量插值,需要使用双引号或字符串串联(或其中的组合)。有关详细信息,请参阅http://php.net/manual/en/language.types.string.php。
您还应该检查mysql_query是否返回了一个有效的结果资源,否则fetch_*、num_rows等将无法处理结果,因为它不是一个结果!IE:
1 2 3 4 5 6 7 8 9 10 11 | $username = $_POST['username']; $password = $_POST['password']; $result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username'); if( $result === FALSE ) { trigger_error('Query failed returning error: '. mysql_error(),E_USER_ERROR); } else { while( $row = mysql_fetch_array($result) ) { echo $row['username']; } } |
有关详细信息,请访问http://us.php.net/manual/en/function.mysql-query.php。
此查询应该有效:
1 2 3 4 5 | $result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '%$username%'"); while($row = mysql_fetch_array($result)) { echo $row['FirstName']; } |
问题是单引号,因此查询失败并返回false,而while循环无法执行。使用%可以匹配包含字符串的任何结果(例如sometext-$username sometext)。
这只是对您的问题的一个回答,您应该实现其他文章中提到的内容:错误处理,使用转义字符串(用户可以在字段中键入任何内容,并且必须确保它不是任意代码),使用pdo代替mysql_connect,这一点现在已被取消了。
1 2 3 4 5 6 7 8 | $username = $_POST['username']; $password = $_POST['password']; $result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '%$username%'") or die(mysql_error()); while($row = mysql_fetch_array($result)) { echo $row['FirstName']; } |
有时将查询抑制为
如果您在这里尝试了所有方法,但都不起作用,那么您可能需要检查您的MySQL数据库排序规则。我的是瑞典人整理的。然后我把它换成了
我希望这能帮助别人。
1 2 3 4 5 6 | $query ="SELECT Name,Mobile,Website,Rating FROM grand_table order by 4"; while( $data = mysql_fetch_array($query)) { echo("<tr><td>$data[0]</td><td>$data[1]</td><td>$data[2]</td><td>$data[3]</td></tr>"); } |
您可以使用这个ORDERBY查询,而不是使用WHERE查询。对于查询的使用来说,这要比这个好得多。
我已经完成了这个查询,没有得到参数或布尔值之类的错误。
尝试此操作,它必须有效,否则需要打印错误以指定问题。
1 2 3 4 5 6 7 8 9 10 | $username = $_POST['username']; $password = $_POST['password']; $sql ="SELECT * from Users WHERE UserName LIKE '$username'"; $result = mysql_query($sql,$con); while($row = mysql_fetch_array($result)) { echo $row['FirstName']; } |
尝试以下代码。它可能工作得很好。
1 2 3 4 5 6 7 8 | $username = $_POST['username']; $password = $_POST['password']; $result = mysql_query("SELECT * FROM Users WHERE UserName ='$username'"); while($row = mysql_fetch_array($result)) { echo $row['FirstName']; } |
可能有两个原因:
在调用mysql_query函数之前,是否打开了与数据库的连接?我在你的代码中没有看到。在进行查询之前使用mysql_connect。见
变量$username在单引号字符串中使用,因此不会在查询中计算其值。查询肯定会失败。
第三,查询结构容易被SQL注入。您可以使用准备好的语句来避免这种安全威胁。
去你的
1 2 3 4 5 6 7 8 9 10 | <?php $username = $_POST['username']; $password = $_POST['password']; $result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '".$username."'"); while($row = mysql_fetch_array($result)) { echo $row['FirstName']; } ?> |
如果有一个具有唯一用户名的用户,您可以使用"="来实现。没有必要喜欢。
您的查询将是:
1 |
在mysql查询之前包含一个连接字符串变量。例如,此代码中的
1 |
不要使用已降级的mysql_*函数(php 5.5中的降级将在php 7中删除)。你可以用mysqli或者pdo做这个
这是完整的选择查询
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <?php $servername ="localhost"; $username ="username"; $password ="password"; $dbname ="myDB"; // Create connection $conn = new mysqli($servername, $username, $password, $dbname); // Check connection if ($conn->connect_error) { die("Connection failed:" . $conn->connect_error); } $sql ="SELECT id, firstname, lastname FROM MyGuests"; $result = $conn->query($sql); if ($result->num_rows > 0) { // output data of each row while($row = $result->fetch_assoc()) { // code here } } else { echo"0 results"; } $conn->close(); ?> |
试试这个
1 2 3 4 5 6 7 8 9 10 | $username = $_POST['username']; $password = $_POST['password']; $result = mysqli_query('SELECT * FROM Users WHERE UserName LIKE $username'); if($result){ while($row = mysqli_fetch_array($result)) { echo $row['FirstName']; } } |
任何时候你得到…
"Warning: mysqli_fetch_object() expects parameter 1 to be mysqli_result, boolean given"
…可能是因为您的查询有问题。
首先,确保错误报告已打开并可见:在打开
1 2 |
如果在php.ini中设置了错误报告,则无需担心这一点。只需确保您处理错误得体,永远不要向您的用户透露任何问题的真正原因。对那些想要伤害你的网站和服务器的人来说,向公众揭示真正的原因可能是一个刻有金字的邀请。如果不想向浏览器发送错误,可以始终监视Web服务器错误日志。日志位置因服务器而异,例如在Ubuntu上,错误日志通常位于
一旦你对标准的错误报告进行了整理,在你的数据库连接和查询上添加错误检查将给你更多关于问题的细节。请看一下这个列名称不正确的例子。首先,返回一般致命错误消息的代码:
1 2 3 4 | $sql ="SELECT `foo` FROM `weird_words` WHERE `definition` = ?"; $query = $mysqli->prepare($sql)); // assuming $mysqli is the connection $query->bind_param('s', $definition); $query->execute(); |
这个错误是一般性的,对您解决正在发生的事情没有太大帮助。
使用更多的代码行,您可以获得非常详细的信息,您可以使用这些信息立即解决问题。检查EDOCX1[4]语句是否正确,如果正确,可以继续绑定和执行。
1 2 3 4 5 6 7 8 9 | $sql ="SELECT `foo` FROM `weird_words` WHERE `definition` = ?"; if($query = $mysqli->prepare($sql)) { // assuming $mysqli is the connection $query->bind_param('s', $definition); $query->execute(); // any additional code you need would go here. } else { $error = $mysqli->errno . ' ' . $mysqli->error; echo $error; // 1054 Unknown column 'foo' in 'field list' } |
如果有什么问题,您可以发出一条错误消息,直接将您带到问题上。在这种情况下,表中没有
如果您选择,您可以将此检查包括在函数或类中,并按照前面提到的方式优雅地处理错误来扩展它。
首先,检查与数据库的连接。是否连接成功?
如果完成了,那么在那之后,我编写了这个代码,它工作得很好:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | if (isset($_GET['q1mrks']) && isset($_GET['marks']) && isset($_GET['qt1'])) { $Q1mrks = $_GET['q1mrks']; $marks = $_GET['marks']; $qt1 = $_GET['qt1']; $qtype_qry = mysql_query(" SELECT * FROM s_questiontypes WHERE quetype_id = '$qt1' "); $row = mysql_fetch_assoc($qtype_qry); $qcode = $row['quetype_code']; $sq_qry =" SELECT * FROM s_question WHERE quetype_code = '$qcode' ORDER BY RAND() LIMIT $Q1mrks "; $sq_qry = mysql_query(" SELECT * FROM s_question WHERE quetype_code = '$qcode' LIMIT $Q1mrks "); while ($qrow = mysql_fetch_array($sq_qry)) { $qm = $qrow['marks'] ."<br />"; $total += $qm ."<br />"; } echo $total ."/" . $marks; } |
1 2 3 4 5 6 7 8 9 10 | <?php $username = $_POST['username']; $password = $_POST['password']; $result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '".mysql_real_escape_string($username)."'")or die(mysql_error()); while($row=mysql_fetch_array($result)) { echo $row['FirstName']; } ?> |
Make Sure You're Not Closing Database By using db_close() Before To
Running Your Query:
如果在一个脚本中使用多个查询,甚至包括包含查询或数据库连接的其他页面,那么在任何地方都可能使用db_close()关闭数据库连接,从而确保在脚本中不会出现此错误。
先检查连接。
然后,如果要从数据库中获取准确的值,则应写入:
1 2 3 | $username = $_POST['username']; $password = $_POST['password']; $result = mysql_query("SELECT * FROM Users WHERE UserName =`$usernam`"); |
或者您想获取
1 |
如果检查时没有出现任何MySQL错误,请确保正确创建了数据库表。这件事发生在我身上。查找任何不需要的逗号或引号。
在执行fetch数组之前,您还可以检查
1 2 3 4 5 6 7 8 9 10 11 12 | $username = $_POST['username']; $password = $_POST['password']; $result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username'); if(!$result) { echo"error executing query:"+mysql_error(); }else{ while($row = mysql_fetch_array($result)) { echo $row['FirstName']; } } |
您可以尝试此代码。我早在遇到类似你的问题时就发现了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | if (isset($_GET['q1mrks']) && isset($_GET['marks']) && isset($_GET['qt1'])) { $Q1mrks = $_GET['q1mrks']; $marks = $_GET['marks']; $qt1 = $_GET['qt1']; $qtype_qry = mysql_query(" SELECT * FROM s_questiontypes WHERE quetype_id = '$qt1' "); $row = mysql_fetch_assoc($qtype_qry); $qcode = $row['quetype_code']; $sq_qry =" SELECT * FROM s_question WHERE quetype_code = '$qcode' ORDER BY RAND() LIMIT $Q1mrks "; $sq_qry = mysql_query(" SELECT * FROM s_question WHERE quetype_code = '$qcode' LIMIT $Q1mrks "); while ($qrow = mysql_fetch_array($sq_qry)) { $qm = $qrow['marks'] ."<br />"; $total += $qm ."<br />"; } echo $total ."/" . $marks; } |
通常,当数据库连接失败时会出现一个错误,因此请确保连接数据库或包含数据库文件。
1 | include_once(db_connetc.php'); |
或
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // Create a connection $connection = mysql_connect("localhost","root","") or die(mysql_error()); //Select database mysql_select_db("db_name", $connection) or die(mysql_error()); $employee_query ="SELECT * FROM employee WHERE `id` ='".$_POST['id']."'"; $employee_data = mysql_query($employee_query); if (mysql_num_rows($employee_data) > 0) { while ($row = mysql_fetch_array($employee_data)){ echo $row['emp_name']; } // end of while loop } // end of if |
- 最佳实践是在sqlyog中运行查询,然后将其复制到页面代码中。
- 始终将查询存储在变量中,然后回送该变量。然后转到
mysql_query($query_variable); 。
试试这个代码,它很好用
将post变量赋给变量
1 2 3 4 5 6 7 8 9 10 11 12 | $username = $_POST['uname']; $password = $_POST['pass']; $result = mysql_query('SELECT * FROM userData WHERE UserName LIKE $username'); if(!empty($result)){ while($row = mysql_fetch_array($result)){ echo $row['FirstName']; } } |
由于$username是一个php变量,我们需要将其作为字符串传递给mysqli,因此,在查询U中,我们将使用双引号、单引号和句号来实现具体化("'$username.'")。如果您以双引号开始,那么您将反转引号(""$username.'')。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | $username = $_POST['username']; $password = $_POST['password']; $result = mysql_query('SELECT * FROM Users WHERE UserName LIKE"'.$username.'"'); while($row = mysql_fetch_array($result)) { echo $row['FirstName']; } $username = $_POST['username']; $password = $_POST['password']; $result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '".$username."'"); while($row = mysql_fetch_array($result)) { echo $row['FirstName']; } |
但是mysql的使用已经贬值了很多,用pdo代替,简单但是非常安全。
传统上,PHP能够容忍错误的实践和代码中的错误,这使得调试非常困难。在这种特定情况下,问题在于mysqli和pdo默认情况下,当查询失败并返回
PDO:使用
1 2 3 4 5 6 7 | error_reporting(E_ALL); $pdo = new PDO("mysql:host=localhost;dbname=test","test",""); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $result = $pdo->query('select emal from users'); $data = $result->fetchAll(); |
这将向您显示以下内容:
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'emal' in 'field list'' in E:\htdocs\test\mysql_errors\pdo.php on line 8
PDOException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'emal' in 'field list' in E:\htdocs\test\mysql_errors\pdo.php on line 8
正如您所看到的,它准确地告诉您查询出了什么问题,以及在代码中应该在哪里修复它。
不带
Fatal error: Call to a member function fetchAll() on boolean in E:\htdocs\test\mysql_errors\pdo.php on line 9
对于mysqli:使用
1 2 3 4 5 6 7 | error_reporting(E_ALL); mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); $mysqli = new mysqli('localhost', 'test', '', 'test'); $result = $mysqli->query('select emal from users'); $data = $result->fetch_all(); |
你会得到
Fatal error: Uncaught exception 'mysqli_sql_exception' with message 'Unknown column 'emal' in 'field list'' in E:\htdocs\test\mysql_errors\mysqli.php on line 8
mysqli_sql_exception: Unknown column 'emal' in 'field list' in E:\htdocs\test\mysql_errors\mysqli.php on line 8
没有
Fatal error: Call to a member function fetch_all() on boolean in E:\htdocs\test\mysql_errors\mysqli.php on line 10
当然,您可以手动检查MySQL错误。但如果每次我打字时都那样做,我会发疯的。-或者更糟-每次我想查询数据库时。