sql >> Database teknologi >  >> RDS >> Mysql

mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows osv... forventer, at parameter 1 er ressource

En forespørgsel kan mislykkes af forskellige årsager, i hvilket tilfælde både mysql_* og mysqli-udvidelsen vil returnere false fra deres respektive forespørgselsfunktioner/-metoder. Du skal teste for denne fejltilstand og håndtere den i overensstemmelse hermed.

mysql_*-udvidelse :

BEMÆRK mysql_ funktionerne er forældet og er blevet fjernet i php version 7.

Tjek $result før du sender det til mysql_fetch_array . Du vil opdage, at det er false fordi forespørgslen mislykkedes. Se mysql_query dokumentation for mulige returværdier og forslag til, hvordan man håndterer 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-udvidelse
procedurestil :

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

ved hjælp af en forberedt erklæring:

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

Disse eksempler illustrerer kun hvad skal gøres (fejlhåndtering), ikke hvordan man gør det. Produktionskoden bør ikke bruge or die når du udskriver HTML, ellers vil det (i det mindste) generere ugyldig HTML. Databasefejlmeddelelser bør heller ikke vises til ikke-administratorbrugere, da det afslører for mange oplysninger .



  1. mysql dynamisk forespørgsel i lagret procedure

  2. MySQL-databaseimplementeringsautomatisering

  3. Skalering af forbindelser i PostgreSQL ved hjælp af Connection Pooling

  4. Sådan gør du RAND() deterministisk i SQL Server