Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in ...
Bij dit stuk code:
<?php
session_start();
session_register('userid');
session_register('username');
// deze regel verwijderen na testing security
// $username = '';
// einde verwijderen
//print "$pasw / $login";
if (!($pasw == '' || $login == ''))
{
// Check hier aanwezigheid in Database
$dbh=mysql_connect ("localhost", "databaseuser", "userpwd") or die ('I cannot connect to the database because: ' . mysql_error());
mysql_select_db ("mijndatabase");
$query = ("SELECT id,Vnaam,Anaam,Login,Pwd,Email FROM gebruiker WHERE Login = '$login' AND Pwd = '$pasw'");
$result=mysql_query($query);
print $query;
while (list($id, $VNaam, $ANaam, $Login, $Pwd, $Email) = mysql_fetch_row($result))
{
print ("$id, $VNaam, $ANaam, $Login, $Pwd, $Email");
$userid=$id;
$username= "$VNaam $ANaam";
}
mysql_close($dbh);
}
Ik heb dit gewoon gecopy pasted van een andere configuratie die gelijkaardig is, daar krijg ik de fout niet.
Volgende dingen heb ik gechecked:
- databaseuser en zijn paswoord zijn correct
- databasenaam is correct
- query geeft een resultaat terug van 1 rij
Het antwoord heb ik gevonden! De database naam was niet juist. Daarom heb ik dit script uitgevoerd:
// get database list
$query = "SHOW DATABASES";
$result = mysql_query($query) or die ("Error in query: $query. ".mysql_error());
echo "<ul>";
while ($row = mysql_fetch_array($result)) {
echo "<li>".$row[0];
// for each database, get table list and print
$query2 = "SHOW TABLES FROM ".$row[0];
$result2 = mysql_query($query2) or die ("Error in query: $query2. ".mysql_error());
echo "<ul>";
while ($row2 = mysql_fetch_array($result2)) {
echo "<li>".$row2[0];
}
echo "</ul>";
}
echo "</ul>";
Toch is het te hopen dat bovenstaand script niet werkt! $pasw en $login komen zo maar uit de lucht vallen, dat duidt op een ernstig veiligheidslek genaamd superglobals.
Begin je script eens met de volgende 2 regels:
<?php
ini_set('display_errors', 1); // 0 = uit, 1 = aan
error_reporting(E_ALL);
// rest van de code
?>
Wat is hiervan het resultaat?
@Markiej: Wanneer ik het zat ben om het wéér te moeten roepen, dan reageer ik gewoon niet. En wat die tutorials betreft, volgens mij staat het al wel ergens maar wordt deze tut gewoon niet gelezen. En de bioscoopbon is hier niet geldig...
Hier een stuk code dat door Jan Koehoorn is gemaakt:
<?php
// bescherming tegen mysql injection
function quote_smart($value)
{
if (get_magic_quotes_gpc()) {
$value = stripslashes($value);
}
if (version_compare(phpversion(), "4.3.0") == "-1") {
return mysql_escape_string($value);
} else {
return mysql_real_escape_string($value);
}
}
function check_array(&$array)
{
foreach ($array as $key => $value) {
$value = quote_smart($value);
$array[$key] = $value;
}
}
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
check_array($_POST);
}
if ($_SERVER['REQUEST_METHOD'] == 'GET') {
check_array($_GET);
}
?>
@Andries: Ik zou geen htmlentities() gebruiken bij het controleren van de input. Ik vind het prima dat de code zo in mijn database terecht komt. Dan kan ik deze data ook gebruiken voor andere zaken dan html. Wil ik het echter op het scherm zetten, dan pas ik uiteraard wel htmlentities toe. Maar dat moet je toch al doen.