mysql _ 拿给数组 ()/mysql_fetch_assoc ()/mysql_fetch_row ()/mysql_num_rows 等希望参数1是资源或结果

共30个回答,已解决, 标签: php mysql

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

mysql _ 予数组 () 期望参数 1 是资源, 布尔给定的布尔值

mysqli _ 予数组 () 期望参数 1 为 mysqli _ 结果, 布尔值给出

调用布尔/非对象上的成员函数获取 _ array ()

这是我的代码:

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

这同样适用于代码, 如

$result = mysqli_query($mysqli, 'SELECT ...');
// mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given
while( $row=mysqli_fetch_array($result) ) {
    ...

$result = $mysqli->query($mysqli, 'SELECT ...');
// Call to a member function fetch_assoc() on a non-object
while( $row=$result->fetch_assoc($result) ) {
    ...

$result = $pdo->query('SELECT ...', PDO::FETCH_ASSOC);
// Invalid argument supplied for foreach()
foreach( $result as $row ) {
    ...

$stmt = $mysqli->prepare('SELECT ...');
// Call to a member function bind_param() on a non-object
$stmt->bind_param(...);

$stmt = $pdo->prepare('SELECT ...');
// Call to a member function bindParam() on a non-object
$stmt->bindParam(...);
第1个答案(采用)

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

mysql _ * 扩展:

注:Mysql _ 函数已弃用, 并已在 php 版本 7 中删除。

$result在将其传递给之前 mysql_fetch_array 进行检查。您会发现这是 false 因为查询失败。有关可能的返回值和如何处理这些值的建议, 请参阅文档. mysql_query

$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 扩展
程序样式:

$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 ) {
        ...

图式:

$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 ) {
      ...

使用准备好的语句:

$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 or die 时不应使用, 否则它将 (至少) 生成无效的 html。此外, 数据库错误消息不应显示给非管理员用户, 因为它泄露了太多的信息

第2个答案

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

  • 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();
    }
    
  • 从 MySQL 命令行或Phpmyadmin等工具运行查询。如果您的查询中有语法错误, 这将告诉您它是什么。

  • 请确保您的报价是正确的。查询或值周围缺少引号可能会导致查询失败。

  • 确保您正在逃避您的价值观。查询中的报价可能会导致查询失败 (也会使您对 SQL 注入保持打开状态)。用于 mysql_real_escape_string() 逃避您的输入。

  • 请确保您没有混合 mysqli_*mysql_* 功能。它们不是一回事, 不能一起使用。(如果你要选择一个或另一个坚持 mysqli_* 。有关原因, 请参见下文。

其他小贴士

mysql_*函数不应用于新代码。他们不再得到维护, 社区已经开始了弃用过程。 相反, 你应该学习准备好的陈述, 使用Pdomysqli.如果您无法做出决定,本文将有助于选择。如果你喜欢学习, 这里是很好的 PDO 教程

第3个答案

这里发生的错误是由于使用单引号 ( ' )。您可以将查询放在这样的位置:

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

它用于 mysql_real_escape_string 防止 SQL 注入。 虽然我们应该使用 MySQLi 或 PDO _ MYSQL 扩展的 PHP (PHP 5.5.0 及更高版本), 但对于旧版本 mysql_real_escape_string 将起到作用。

第4个答案

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

$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() . "\n";
    echo 'Whole query: ' . $query;
}

有关详细信息, mysql_query() 请参阅文档。

实际错误是单引号, 因此 $username 不会分析变量。但您确实应该使用 mysql_real_escape_string($username) 来避免 SQL 注入。

第5个答案

把引号放在周围 $username 。字符串值 (相对于数值) 必须用引号括起来。

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

另外, LIKE 如果你不使用通配符, 使用这个条件也没有意义: 如果你需要完全匹配 = LIKE 的使用而不是。

第6个答案

如果选择的数据库未被选中, 请检查一下, 因为某些时候没有选择数据库

检查

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());
第7个答案

你的代码应该是这样的

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

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

第8个答案
$result = mysql_query('SELECT * FROM Users WHERE UserName LIKE $username');

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

此外, 您应该检查 mysql _ query 返回的结果资源是否有效, 否则获取 _ *、num _ 行等将无法处理结果, 因为不是结果!即:

$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。

第9个答案

此查询应有效:

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

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

这只是你的问题的答案, 你应该实现其他帖子中提到的东西: 错误处理, 使用转义字符串 (用户可以在字段中键入任何内容, 并且您必须确保它不是任意代码), 使用Pdo代替 mysql _ connect 这是现在堕落。

第10个答案
$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);

第11个答案

如果您在此处尝试了所有内容, 但它不起作用, 则可能需要检查 MySQL 数据库排序规则。我的工作将改为瑞典语的整理。然后我把它改成 utf8_general_ci 了, 一切都点击成了装备。

我希望这对某人有帮助。

第12个答案
$query = "SELECT Name,Mobile,Website,Rating FROM grand_table order by 4";

while( $data = mysql_fetch_array($query))
{
    echo("$data[0]$data[1]$data[2]$data[3]");
}

您可以使用此 ORDER by 查询, 而不是使用 where 查询。它比这远远好于此使用查询。

我已经完成了这个查询, 没有得到任何错误, 如参数或布尔。

第13个答案

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

$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'];
}
第14个答案

请尝试以下代码。它可能工作得很好。

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

while($row = mysql_fetch_array($result))
{
    echo $row['FirstName'];
}
第15个答案

可能有两个原因:

  1. 在调用 mysql _ query 函数之前, 您是否打开了与数据库的连接?我在你的密码里没看到。在进行查询之前, 请使用 mysql _ connect。看到php.net/manual/en/function.mysql-connect.php

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

第三, 查询的结构容易受到Sql 注入的影响。您可以使用准备好的语句来避免这种安全威胁。

第16个答案

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

第17个答案

如果有具有唯一用户名的用户, 则可以使用 "=" 来实现此目的。没有必要去喜欢。

您的查询将是:

mysql_query("SELECT * FROM Users WHERE UserName ='".$username."'");
第18个答案

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

$results = mysql_query($connt, "SELECT * FROM users");
第19个答案

不要使用可执行的 mysql _ * 函数 (在 php 5.5 中的 depricated 将在 php 7 中删除)。你可以用mysqlipdo来做这个

这里是完整的选择查询

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();
?>
第20个答案

试试这个

$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'];
}
}
第21个答案

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

如果它完成了, 那么之后, 我已经写了这个代码, 它的工作原理很好:

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'] . "";
        $total += $qm . "";
    }
    echo $total . "/" . $marks;
}
第22个答案
第23个答案

任何时候你得到的..。

"警告: mysqli \ 予对象 () 期望参数 1 为 mysqli _ 结果, 给出布尔值"_

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

首先, 请确保错误报告处于打开状态且可见: 在打开标记后将这两行添加到文件顶部: <>

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

如果出了问题, 你可以吐出一条错误消息, 直接带你去解决这个问题。在这种情况下 foo , 表中没有列, 解决问题是微不足道的。

如果您愿意, 则可以将此检查包含在函数或类中, 并通过正常处理错误来扩展它, 如前面所述。

第24个答案

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

如果您在脚本中使用多个查询, 即使您包括包含查询或数据库连接的其他页面, 则可能在任何位置使用 db _ close () 来关闭数据库连接, 因此请确保您没有这样做脚本中的错误。

第25个答案

首先检查您的连接。

然后, 如果要从数据库中获取确切的值, 则应编写:

$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%'");
第26个答案

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

第27个答案

$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'];
       }
}
第28个答案

您可以尝试此代码。我早些时候发现它时, 我遇到了一个类似于你的问题。

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'] . "";
    $total += $qm . "";
}
echo $total . "/" . $marks;
}
第29个答案

通常, 当数据库配置失败时, 会发生错误, 因此请确保连接数据库或包含数据库文件。

include_once(db_connetc.php');

// 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);
第30个答案

尝试此代码, 它的工作正常

将发布变量分配给变量

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

相关问题

mysql _ 拿给数组 ()/mysql_fetch_assoc ()/mysql_fetch_row ()/mysql_num_rows 等希望参数1是资源或结果 参考-此错误在 PHP 中意味着什么? 如何在 PHP 中分析和处理 HTML\ xml? 如何防止 PHP 中的 SQL 注入?