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.
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í
.