猿问

mysql_fetch_array()/mysql_fetch等…期望参数1是资源或结果

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


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



mysqli_FETCH_Array()期望参数1为mysqli_test,布尔给定



调用布尔/非对象上的成员函数FETCH_Array()


这是我的密码:


$username = $_POST['username'];

$password = $_POST['password'];


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


while($row = mysql_fetchmysql_fetch_array()/mysql_fetch等…期望参数1是资源或结果_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(...);


开满天机
浏览 1198回答 4
4回答

料青山看我应如是

由于各种原因,查询可能失败,在这种情况下,mysql_*和mysqli扩展都将返回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 queryif($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 ) {       ...

三国纷争

当查询中出现导致查询失败的错误时,将显示此错误消息。当使用: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_*。见下文的原因。)

慕丝7291255

这里发生错误是由于使用单引号(')。您可以这样放置查询:mysql_query(" SELECT * FROM Users  WHERE UserName  LIKE '".mysql_real_escape_string ($username)."' ");它正在使用mysql_real_escape_string用于防止SQL注入。虽然我们应该使用MySQLi或PDO_MySQL扩展来升级PHP版本(PHP5.5.0及更高版本),但是对于旧版本mysql_real_escape_string会成功的。
随时随地看视频慕课网APP
我要回答