Mysql
 sql >> Baza danych >  >> RDS >> Mysql

mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows itd... oczekuje, że parametr 1 będzie zasobem

Zapytanie może zakończyć się niepowodzeniem z różnych powodów, w którym to przypadku zarówno mysql_*, jak i rozszerzenie mysqli zwrócą false z odpowiednich funkcji/metod zapytania. Musisz przetestować ten stan błędu i odpowiednio go obsłużyć.

rozszerzenie mysql_* :

UWAGA funkcje mysql_ są przestarzałe i zostały usunięte w wersji php 7.

Sprawdź $result przed przekazaniem go do mysql_fetch_array . Przekonasz się, że to false ponieważ zapytanie nie powiodło się. Zobacz mysql_query dokumentacja dotycząca możliwych wartości zwrotów i sugestie, jak sobie z nimi radzić.

$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'];
}

rozszerzenie mysqli
styl proceduralny :

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

w stylu oo :

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

za pomocą przygotowanego oświadczenia:

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

Te przykłady pokazują tylko, co należy zrobić (obsługa błędów), a nie jak to zrobić. Kod produkcyjny nie powinien używać or die podczas wysyłania HTML, w przeciwnym razie (przynajmniej) wygeneruje nieprawidłowy kod HTML. Ponadto komunikaty o błędach bazy danych nie powinny być wyświetlane użytkownikom niebędącym administratorami, ponieważ ujawnia zbyt wiele informacji .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zweryfikować kopie zapasowe MySQL za pomocą ClusterControl

  2. Jak przekonwertować strefę czasową w MySQL

  3. Czy można zrobić klucz obcy MySQL w jednej z dwóch możliwych tabel?

  4. Jak mogę zapobiec wstrzykiwaniu SQL w PHP?

  5. Ostrzeżenie:mysql_result() oczekuje, że parametr 1 będzie zasobem, podana wartość logiczna