sql >> Databasteknik >  >> RDS >> Mysql

mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows etc... förväntar sig att parameter 1 är resurs

En fråga kan misslyckas av olika anledningar i vilket fall både mysql_* och mysqli-tillägget returnerar false från sina respektive frågefunktioner/-metoder. Du måste testa för det feltillståndet och hantera det därefter.

mysql_*-tillägget :

OBS mysql_-funktionerna är utfasade och har tagits bort i php version 7.

Kontrollera $result innan du skickar den till mysql_fetch_array . Du kommer att upptäcka att det är false eftersom frågan misslyckades. Se mysql_query dokumentation för möjliga returvärden och förslag på hur man kan hantera dem.

$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-tillägg
procedurstil :

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

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

med ett förberett uttalande:

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

Dessa exempel illustrerar bara vad ska göras (felhantering), inte hur man gör. Produktionskoden ska inte använda or die när HTML matas ut, annars kommer den (åtminstone) att generera ogiltig HTML. Databasfelmeddelanden bör inte heller visas för icke-adminanvändare, eftersom det avslöjar för mycket information .



  1. Vad är maxstorleken på VARCHAR2 i PL/SQL och SQL?

  2. Hur man omdefinierar kolumner som returneras av en lagrad procedur i SQL Server

  3. Oracle-entiteten i VS-entitetsramverket uppdaterar inte primärnyckeln i koden

  4. NULL komplexitet – Del 4, Saknar unik standardbegränsning