php - mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows等…期望参数1为资源或结果

标签 php mysql

我正在尝试从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(...);

最佳答案

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

mysql_* extension


  注意mysql_ functions are deprecated和已在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 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 ) {
        ...


oo风格:

$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。另外,数据库错误消息也不应显示给非管理员用户,如discloses too much information所示。

关于php - mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows等…期望参数1为资源或结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36769071/

相关文章:

php - 音频波形许可被拒绝bbcrd

javascript - 如何在 php 中显示具有不同响应的警告框?

php - 使用php在excel中导出报告时,它可以在本地工作,但不能在服务器上工作?

javascript - 如何将 mysql 结果传递给变量以在模板引擎中呈现

php - MySQL - 用户访问被拒绝

java - 如何在java中使用可以在任何计算机上运行的数据库

php - 我怎样才能在循环外获取foreach循环变量

php - 当不同文件的内容发生变化时,如何刷新 HTML 文件?

php - 当我使用PDO时我应该使用addslashes函数吗?

php - 谁添加 "_"单下划线查询参数?