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