社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

mysql error mysqli_num_rows()希望参数1在数据更新期间是mysqli_result[重复]

Syamsul • 5 年前 • 2183 次点击  

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

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

mysqli_fetch_array()期望参数1是mysqli_result,给定布尔值

对布尔/非对象的成员函数fetch_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(...);
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/44092
 
2183 次点击  
文章 [ 30 ]  |  最新文章 5 年前
Jack Tuck Dip Pokhrel
Reply   •   1 楼
Jack Tuck Dip Pokhrel    11 年前
$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);

Enis P. Aginić
Reply   •   2 楼
Enis P. Aginić    12 年前

此查询应该有效:

$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现在被删除。

derokorian
Reply   •   3 楼
derokorian    13 年前
$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等将无法处理结果,因为这不是结果!IE:

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

Ghostman Chaitannya
Reply   •   4 楼
Ghostman Chaitannya    13 年前

你的代码应该是这样的

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

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

RAS yasin
Reply   •   5 楼
RAS yasin    13 年前

如果选择的数据库不是,请检查,因为有些时候没有选择数据库

检查

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());
Matteo Riva
Reply   •   6 楼
Matteo Riva    15 年前

在周围加引号 $username . 字符串值与数值相反,必须用引号括起来。

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

而且,使用 LIKE 条件(如果不使用通配符):如果需要完全匹配,请使用 = 而不是 喜欢 .

Community Sean Michaud
Reply   •   7 楼
Community Sean Michaud    8 年前

AS scompt.com explained ,查询可能会失败。使用以下代码获取查询的错误或正确结果:

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

documentation for mysql_query() 了解更多信息。

实际的错误是单引号,因此变量 $username 未分析。但你真的应该用 mysql_real_escape_string($username) 以避免sql注入。

nik
Reply   •   8 楼
nik    9 年前

此处出现错误是由于使用了单引号( ' )您可以这样放置查询:

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

它正在使用 mysql_real_escape_string 用于防止SQL注入。 虽然我们应该在升级版的php(php 5.5.0及更高版本)中使用mysqli或pdo-mysql扩展,但对于旧版本 mysql_real_escape_字符串 会成功的。

John Conde
Reply   •   9 楼
John Conde    10 年前

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

  • mysql_fetch_array / mysqli_fetch_array()
  • mysql_fetch_assoc() / mysqli_fetch_assoc()
  • mysql_num_rows() / mysqli_num_rows()

注释 :此错误会 如果查询不影响任何行,则显示。只有语法无效的查询才会生成此错误。

故障排除步骤

  • 确保已将开发服务器配置为显示所有错误。您可以将其放在文件顶部或配置文件中: error_reporting(-1); . 如果你有任何语法错误,这将指出他们给你。

  • 使用 mysql_error() . MySQL错误() 将报告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_* 功能。它们不是同一个东西,不能一起使用。(如果你要选择其中一个 MyQuiLi* . 原因见下文。)

其他提示

MyQuL** 函数不应用于新代码。他们不再被维护,社区已经开始 deprecation process . 相反,你应该了解 prepared statements 使用任何一种 PDO MySQLi . 如果你不能决定, this article 有助于选择。如果你想学习,这里是 good PDO tutorial .

Community Sean Michaud
Reply   •   10 楼
Community Sean Michaud    8 年前

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

mysql_* extension :

注释 这个 mysql_ functions are deprecated 并已在php版本7中删除。

检查 $result 在把它交给 mysql_fetch_array . 你会发现 因为查询失败。见 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 extension
程序样式 :

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

这些例子只说明 什么 应该做(错误处理),而不是怎么做。生产代码不应使用 or die 当输出html时,否则它(至少)将生成无效的html。另外,数据库错误消息不应该显示给非管理员用户,因为它 discloses too much information .