mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows等…

我正在尝试从MySQL表中选择数据,但我收到以下错误消息之一:

mysql_fetch_array()期望参数1是资源,给定布尔值

这是我的代码:

$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'];}
773632 次浏览

查询可能会由于各种原因失败,在这种情况下,mysql_*和mysqli扩展都将从各自的查询函数/方法返回false。您需要测试该错误条件并相应地处理它。

mysql_扩展

mysql_函数已弃用并已在php版本7中删除。

在将其传递给mysql_fetch_array之前检查$result。您会发现它是false,因为查询失败。请参阅[mysql_query][1]留档以获取可能的返回值以及如何处理它们的建议。

$username = mysql_real_escape_string($_POST['username']);$password = $_POST['password'];$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '$username'");
if($result === FALSE) {trigger_error(mysql_error(), E_USER_ERROR);}
while($row = mysql_fetch_array($result)){echo $row['FirstName'];}

将引号放在$username周围。字符串值,而不是数值,必须用引号括起来。

$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '$username'");

此外,如果您不使用通配符,则使用LIKE条件没有意义:如果您需要精确匹配,请使用=而不是LIKE

此处发生的错误是由于使用了单引号(')。您可以像这样输入查询:

mysql_query("SELECT * FROM UsersWHERE UserNameLIKE '".mysql_real_escape_string ($username)."'");

它使用mysql_real_escape_string来防止SQL注射。虽然我们应该使用MySQLi或PDO_MYSQL扩展来升级PHP版本(PHP 5.5.0及更高版本),但对于旧版本mysql_real_escape_string会起作用。

scompt.com解释了,查询可能会失败。使用此代码获取查询的错误或正确的结果:

$username = $_POST['username'];$password = $_POST['password'];
$result = mysql_query("SELECT * FROM UsersWHERE UserName LIKE '".mysql_real_escape_string($username)."'");
if($result){while($row = mysql_fetch_array($result)){echo $row['FirstName'];}} else {echo 'Invalid query: ' . mysql_error() . "\n";echo 'Whole query: ' . $query;}

请参阅留档#0以获取更多信息。

实际的错误是单引号,所以变量$username没有被解析。但是您真的应该使用mysql_real_escape_string($username)来避免SQL注入。

你的代码应该是这样的

$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'];}

完成后,您将在屏幕上打印查询。在您的服务器上尝试此查询,看看它是否产生所需的结果。大多数时候错误都在查询中。其余代码是正确的。

$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');

您使用单引号定义字符串,PHP不解析单引号分隔的字符串。为了获得变量插值,您需要使用双引号或字符串连接(或其中的组合)。有关更多信息,请参阅http://php.net/manual/en/language.types.string.php

此外,您应该检查mysql_query返回了有效的结果资源,否则fetch_*,num_rows等将无法处理结果,因为它不是结果!

$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了解更多信息。

选择数据库后请检查是否因为某些时候数据库未被选择

检查

mysql_select_db('database name ')or DIE('Database name is not available!');

在MySQL查询之前然后进入下一步

$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');
f($result === FALSE) {die(mysql_error());

当您的查询中出现导致其失败的错误时,会显示此错误消息。它将在使用时显示:

  • 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在执行查询时遇到的任何错误。

    样品用法:

    mysql_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();}
  • Run your query from the MySQL command line or a tool like phpMyAdmin. If you have a syntax error in your query this will tell you what it is.

  • Make sure your quotes are correct. A missing quote around the query or a value can cause a query to fail.

  • Make sure you are escaping your values. Quotes in your query can cause a query to fail (and also leave you open to SQL injections). Use mysql_real_escape_string() to escape your input.

  • Make sure you are not mixing mysqli_* and mysql_* functions. They are not the same thing and cannot be used together. (If you're going to choose one or the other stick with mysqli_*. See below for why.)

Other tips

mysql_* functions should not be used for new code. They are no longer maintained and the community has begun the deprecation process. Instead you should learn about prepared statements and use either PDO or MySQLi. If you can't decide, this article will help to choose. If you care to learn, here is good PDO tutorial.

如果您尝试了这里的所有方法,但它不起作用,您可能需要检查您的MySQL数据库排序规则。我的设置为瑞典排序规则。然后我将其更改为utf8_general_ci,一切都进入了轨道。

试试这个,它必须工作,否则你需要打印错误来指定你的问题

$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'];}

这个查询应该工作:

$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '%$username%'");while($row = mysql_fetch_array($result)){echo $row['FirstName'];}

问题是单引号,因此您的查询失败并返回FALSE,并且您的WHILE循环无法执行。使用%允许您匹配包含您的字符串的任何结果(例如某些文本-$用户名-某些文本)。

这只是对你问题的回答,你应该实现其他帖子中提到的东西:错误处理,使用转义字符串(用户可以在字段中键入任何内容,并且你必须确保它不是任意代码),使用PDO代替mysql_connect现在已被删除。

首先,检查您与数据库的连接。它是否连接成功?

如果完成了,然后我写了这段代码,效果很好:

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_questiontypesWHERE quetype_id = '$qt1'");$row = mysql_fetch_assoc($qtype_qry);$qcode = $row['quetype_code'];
$sq_qry = "SELECT *FROM s_questionWHERE quetype_code = '$qcode'ORDER BY RAND() LIMIT $Q1mrks";$sq_qry = mysql_query("SELECT *FROM s_questionWHERE quetype_code = '$qcode'LIMIT $Q1mrks");while ($qrow = mysql_fetch_array($sq_qry)) {$qm = $qrow['marks'] . "<br />";$total += $qm . "<br />";}echo $total . "/" . $marks;}

可能有两个原因:

  1. 在调用mysql_query函数之前,您是否打开了与数据库的连接?在您的代码中没有看到这一点。在进行查询之前使用mysql_connect。请参阅php.net/manual/en/function.mysql-connect.php

  2. 变量$username在单引号字符串中使用,因此不会在查询中评估其值。查询肯定会失败。

第三,查询的结构容易出现SQL注射。您可以使用准备好的语句来避免这种安全威胁。

$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_query(your query);

尝试以下代码。它可能会正常工作。

$username = $_POST['username'];$password = $_POST['password'];$result = mysql_query("SELECT * FROM Users WHERE UserName ='$username'");
while($row = mysql_fetch_array($result)){echo $row['FirstName'];}

首先检查您的连接。

然后,如果您想从数据库中获取确切的值,那么您应该编写:

$username = $_POST['username'];$password = $_POST['password'];$result = mysql_query("SELECT * FROM Users WHERE UserName =`$usernam`");

或者你想获取LIKE类型的值,那么你应该写:

$result = mysql_query("SELECT * FROM Users WHERE UserName LIKE '%$username%'");
$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>");}

您可以使用此ORDER BY查询而不是使用WHere查询。使用查询比这要好得多。

我已经完成了这个查询,并且没有像参数或布尔值这样的错误。

<?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'];}?>

如果有一个用户具有唯一的用户名,您可以为此使用“=”。无需喜欢。

您的查询将是:

mysql_query("SELECT * FROM Users WHERE UserName ='".$username."'");

转到您的config.php。我遇到了同样的问题。验证用户名和密码,并且sql选择与配置同名。

在MySQL查询之前包含一个连接字符串变量。例如,此代码中的$connt

$results = mysql_query($connt, "SELECT * FROM users");

你也可以在执行提取数组之前,像这样检查阉羊$result是否失败

$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'];}}

通常,当数据库一致性失败时会发生错误,因此请务必连接数据库或包含数据库文件。

include_once(db_connetc.php');

// Create a connection$connection = mysql_connect("localhost", "root", "") or die(mysql_error());
//Select databasemysql_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变量赋值给变量

   $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'];}}

确保您没有关闭数据库通过使用db_close()之前运行查询:

如果您在脚本中使用多个查询,即使您包含包含查询或数据库连接的其他页面,那么在您使用db_close()的任何地方都可能关闭数据库连接,因此请确保您没有在脚本中犯此错误。

如果您在检查时没有出现任何MySQL错误,请确保您正确创建了数据库表。这发生在我身上。寻找任何不需要的逗号或引号。

<?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'];}?>

不要使用depr的mysql_*函数(在php 5.5中depr的将在php 7中删除)。你可以用mysqlipdo来做这个

这里是完整的选择查询

<?php$servername = "localhost";$username = "username";$password = "password";$dbname = "myDB";
// Create connection$conn = new mysqli($servername, $username, $password, $dbname);// Check connectionif ($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 rowwhile($row = $result->fetch_assoc()) {// code here}} else {echo "0 results";}$conn->close();?>

试试这个

$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'];}}

任何时候你得到…

"警告:mysqli_fetch_object()期望参数1mysqli_result,布尔值给定"

…这可能是因为您的查询有问题。prepare()query()可能会返回FALSE(布尔值),但这种通用的失败消息不会给您留下太多线索。您如何找出您的查询有什么问题?你

首先,确保错误报告已打开并可见:在打开<?php标记后立即将这两行添加到文件顶部:

error_reporting(E_ALL);ini_set('display_errors', 1);

如果您的错误报告已设置在php.ini中,您不必担心这一点。只需确保您优雅地处理错误,并且永远不会向用户透露任何问题的真正原因。向公众揭示真实原因对于那些想要伤害您的网站和服务器的人来说可能是一个金雕邀请。如果您不想向浏览器发送错误,您可以随时监控您的Web服务器错误日志。日志位置因服务器而异,例如,在Ubuntu上,错误日志通常位于/var/log/apache2/error.log。如果您正在Linux环境中检查错误日志,您可以在控制台窗口中使用tail -f /path/to/log来查看实时发生的错误……或您制作的错误。

一旦您确定了标准错误报告,在数据库连接和查询上添加错误检查将为您提供有关正在发生的问题的更多详细信息。看看这个列名不正确的示例。首先,返回通用致命错误消息的代码:

$sql = "SELECT `foo` FROM `weird_words` WHERE `definition` = ?";$query = $mysqli->prepare($sql)); // assuming $mysqli is the connection$query->bind_param('s', $definition);$query->execute();

这个错误是通用的,对你解决正在发生的事情没有多大帮助。

再多几行代码,您就可以获得非常详细的信息,您可以使用这些信息来解决问题立即。检查prepare()语句的真实性,如果它好,您可以继续绑定和执行。

$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; // 1054 Unknown column 'foo' in 'field list'// handle error}

如果出现问题,您可以发出错误消息,直接找到问题。在这种情况下,表中没有foo列,解决问题很简单。

如果您选择,您可以在函数或类中包含此检查,并通过如前所述优雅地处理错误来扩展它。

由于$username是一个php变量,我们需要将其作为字符串传递给mysqli,因此由于在查询中u以单引号开头,我们将使用双引号、单引号和句号进行连接("'.$username.'"),如果您以双引号开头,那么您将反转引号('".$username."')。

$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已经贬值了很多,使用PDOinstead.it很简单但很安全

传统上,PHP一直容忍代码中的不良实践和失败,这使得调试非常困难。在这个特殊情况下的问题是mysqliPDO默认情况下,当查询失败并仅返回FALSE时,不会告诉您。(我不会谈论被丢弃的mysql扩展。对准备好的声明的支持是切换到PDOmysqli的充分理由。)但是您可以将PHP的默认行为更改为在查询失败时始终抛出例外

对于PDO:使用$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

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

这将向您显示以下内容:

致命错误:未捕获异常'PDOException'与消息'SQLSTATE[42S22]:列未找到: 1054未知列'emal'in'field list"in E:\htdocs\test\mysql_errors\pdo.php第8行

PDOException: SQLSTATE[42S22]:列未找到: 1054未知列'emal'in'field list'in E:\htdocs\test\mysql_errors\pdo.php第8行

如您所见,它准确地告诉您查询出了什么问题,以及在代码中的哪里修复它。

没有$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);你会得到

致命错误:在E:\htdocs\test\mysql_errors\pdo.php第9行中的布尔值上调用成员函数readchAll()

对于mysqli:使用mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

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

你会得到

致命错误:未捕获的异常'mysqli_sql_exception'与消息'未知列'emal'在'字段列表"在E:\htdocs\test\mysql_errors\mysqli.php第8行

mysqli_sql_exception:在E:\htdocs\test\mysql_errors\中的字段列表中的未知列'emal'mysqli.php第8行

没有mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);,你只能得到

致命错误:调用成员函数fetch_all()在E:\htdocs\test\mysql_errors\mysqli.php第10行

当然,您可以手动检查MySQL错误。但如果我每次打错字都要这么做我会发疯的-或者更糟-每次我想查询数据库时。