sql >> Databáze >  >> RDS >> Mysql

mysql_fetch_array()/mysql_fetch_assoc()/mysql_fetch_row()/mysql_num_rows atd... očekává, že parametr 1 bude zdrojem

Dotaz může selhat z různých důvodů a v takovém případě rozšíření mysql_* i rozšíření mysqli vrátí false z jejich příslušných dotazovacích funkcí/metod. Musíte otestovat tento chybový stav a podle toho s ním zacházet.

rozšíření mysql_* :

POZNÁMKA funkce mysql_ jsou zastaralé a byly odstraněny v php verze 7.

Zkontrolujte $result před předáním do mysql_fetch_array . Zjistíte, že je false protože dotaz selhal. Viz mysql_query dokumentaci možných návratových hodnot a návrhy, jak s nimi naložit.

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

rozšíření mysqli
procedurální styl :

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

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

pomocí připraveného příkazu:

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

Tyto příklady pouze ilustrují co by mělo být provedeno (zpracování chyb), nikoli jak to udělat. Produkční kód by neměl používat or die při výstupu HTML, jinak to (přinejmenším) vygeneruje neplatný HTML. Chybové zprávy databáze by se také neměly zobrazovat uživatelům, kteří nejsou správci, protože odhaluje příliš mnoho informací .



  1. Proč je UDF mnohem pomalejší než poddotaz?

  2. Top 7 databází

  3. Docker kontejner pro Postgres 9.1 neodhaluje port 5432 hostiteli

  4. Jaký je rozdíl mezi spojeními oddělenými čárkami a spojením podle syntaxe v MySQL?