sql >> Database >  >> RDS >> Mysql

mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows etc... verwacht dat parameter 1 resource is

Een query kan om verschillende redenen mislukken, in welk geval zowel de mysql_* als de mysqli-extensie false retourneert van hun respectievelijke zoekfuncties/-methoden. U moet die foutconditie testen en dienovereenkomstig behandelen.

mysql_* extensie :

OPMERKING De mysql_-functies zijn verouderd en zijn verwijderd in php versie 7.

Controleer $result voordat je het doorgeeft aan mysql_fetch_array . Je zult zien dat het false . is omdat de query is mislukt. Zie de mysql_query documentatie voor mogelijke retourwaarden en suggesties om hiermee om te gaan.

$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-extensie
procedurele stijl :

$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-stijl :

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

met behulp van een voorbereide verklaring:

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

Deze voorbeelden illustreren alleen wat moet worden gedaan (foutafhandeling), niet hoe het moet. Productiecode mag geen gebruik maken van or die bij het uitvoeren van HTML, zal het anders (op zijn minst) ongeldige HTML genereren. Ook mogen database-foutberichten niet worden weergegeven aan niet-beheerders, omdat het geeft te veel informatie .



  1. Compressie inschakelen op een bestaande tabel in SQL Server (T-SQL)

  2. Wat betekent een (+) teken in een Oracle SQL WHERE-clausule?

  3. ID ophalen van laatst ingevoegde record in orakel db

  4. Hoe vind je alle tabellen met externe sleutels die verwijzen naar bepaalde table.column en die waarden hebben voor die externe sleutels?