php - mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row() expects parameter 1 to be resource -
i trying select data mysql table, 1 of following error messages:
mysql_fetch_array() expects parameter 1 resource, boolean given
or
mysqli_fetch_array() expects parameter 1 mysqli_result, boolean given
or
call member function fetch_array() on boolean / non-object
this code:
$username = $_post['username']; $password = $_post['password']; $result = mysql_query('select * users username $username'); while($row = mysql_fetch_array($result)) { echo $row['firstname']; }
the same applies code
$result = mysqli_query($mysqli, 'slect ...'); // mysqli_fetch_array() expects parameter 1 mysqli_result, boolean given while( $row=mysqli_fetch_array($result) ) { ...
and
$result = $mysqli->query($mysqli, 'selct ...'); // call member function fetch_assoc() on non-object while( $row=$result->fetch_assoc($result) ) { ...
and
$result = $pdo->query('slect ...', pdo::fetch_assoc); // invalid argument supplied foreach() foreach( $result $row ) { ...
and
$stmt = $mysqli->prepare('slect ...'); // call member function bind_param() on non-object $stmt->bind_param(...)
and
$stmt = $pdo->prepare('slect ...'); // call member function bindparam() on non-object $stmt->bindparam(...)
a query may fail various reasons in case both mysql_* , mysqli extension return false
respective query functions/methods. need test error condition , handle accordingly.
note mysql_ functions deprecated , have been removed in php version 7.
check $result
before passing mysql_fetch_array
. you'll find it's false
because query failed. see mysql_query
documentation possible return values , suggestions how deal them.
$username = mysql_real_escape_string($_post['username']); $password = $_post['password']; $result = mysql_query("select * users username '$username'"); if($result === false) { die(mysql_error()); // todo: better error handling } while($row = mysql_fetch_array($result)) { echo $row['firstname']; }
mysqli extension
procedural style:
$username = mysqli_real_escape_string($mysqli, $_post['username']); $result = mysqli_query($mysqli, "select * users username '$username'"); // mysqli_query returns false if went wrong query if($result === false) { yourerrorhandler(mysqli_error($mysqli)); } else { // of php 5.4 mysqli_result implements traversable, can use foreach foreach( $result $row ) { ...
oo-style:
$username = $mysqli->escape_string($_post['username']); $result = $mysqli->query("select * users username '$username'"); if($result === false) { yourerrorhandler($mysqli->error); // or $mysqli->error_list } else { // of php 5.4 mysqli_result implements traversable, can use foreach foreach( $result $row ) { ...
using prepared statement:
$stmt = $mysqli->prepare('select * users username ?'); 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(); // of php 5.4 mysqli_result implements traversable, can use foreach foreach( $result $row ) { ...
these examples illustrate what should done (error handling), not how it. production code shouldn't use or die
when outputting html, else (at least) generate invalid html. also, database error messages shouldn't displayed non-admin users, discloses information.
Comments
Post a Comment