Door
Suzanne Brok
op 14-12-2015 14:40
gewijzigd op 14-12-2015 17:13
1.603 views
Goede dag,
Ik heb problemen met mijn loginform. Ik krijg elke keer als ik met een bestaande gebruiker in wil loggen de volgende foutmelding:
Warning: mysqli_select_db() expects exactly 2 parameters, 1 given in login.php on line 22
Call Stack
# Time Memory Function Location
1 0.0005 139592 {main}( ) ..\login.php:0
2 0.0017 146848 mysqli_select_db ( ) ..\login.php:22
cannot select DB
Wat doe ik verkeerd? De tabel die ik nodig heb heet users en staat onder de database vriendenboek.
Hierbij mijn code (ik gebruik ook een member, waar alles opgeslagen wordt, en een register php pagina).
<html>
<head>
<title>Login</title>
</head>
<body>
<link rel="stylesheet" href="css/style.css">
<p><a href="register.php">Register</a> | <a href="login.php">Login</a></p>
<h3>Login Formulier</h3>
<form action="" method="POST">
naam: <input type="text" name="naam"><br />
wachtwoord: <input type="wachtwoord" name="wachtwoord"><br />
<input type="submit" value="Login" name="submit" />
</form>
<?php
if(isset($_POST["submit"])){
if(!empty($_POST['naam']) && !empty($_POST['wachtwoord'])) {
$naam=$_POST['naam'];
$wachtwoord=$_POST['wachtwoord'];
$con=mysqli_connect('localhost','root','') or die(mysqli_error());
mysqli_select_db('vriendenboek') or die("cannot select DB");
//zoekt in de database users
$query=mysqli_query("SELECT * FROM users WHERE naam='".$naam."' AND wachtwoord='".$wachtwoord."'");
$numrows=mysqli_num_rows($query);
if($numrows!=0)
{
while($row=mysqli_fetch_assoc($query))
{
$dbnaam=$row['naam'];
$dbwachtwoord=$row['wachtwoord'];
}
if($naam == $dbnaam && $wachtwoord == $dbwachtwoord)
{
//start een sessie
session_start();
$_SESSION['sess_naam']=$naam;
/* gaat naar de volgende site */
header("Location: member.php");
}
} else {
echo "Ongeldige naam or wachtwoord!";
}
// niet alles ingevuld dan wordt de volgende melding getoond
} else {
echo "Alle velden dienen ingevuld te zijn!";
}
}
?>
</body>
</html>
Nee die beveiliging van wachtwoord komt nog. Ik wilde eerst dit even werkend krijgen. Daarna ga ik het wachtwoord versleutelen).
Kun je me aangeven welke ik mis? De connectie naar de database toe?
Ik ben hier al een tijd mee bezig en blijf die stomme foutmelding houden. Gelukkig snap ik nu door jou wel dat het een de parameter ligt.
Als je me even wat beter op weg kunt helpen zou dat geweldig zijn.
Nee ik ga het wachtwoord beveiligen maar ik wil eerst dit script af hebben, dus zonder die fout.
En dat wil me nog niet lukken. Als hij werkt dan pas ga ik het wachtwoord versleutelen.
Ik vind dit al lastig genoeg.
[size=xsmall]Toevoeging op 14/12/2015 15:15:16:[/size]
"Volgens mij staat die toch op lijn 8 of bedoel je die niet?"
Ja, en die moet je dus gebruiken op regel 9. Je roept nu tegen mysqli_select_db() om de database "vriendenclub" te gebruiken. De wedervraag is dan "op welke verbinding?"
Euh, ik kan mij vergissen, maar bij MySQLi selecteer je doorgaans bij het maken van een verbinding direct een database, waarom zou je dat op een later moment pas doen?
Tenzij de bovenstaande code direct is omgezet vanuit een variant die zich bediende van mysql_ functies, in welk geval het niet zou misstaan om de hele code eens te reviewen daar deze mogelijk op sommige plaatsen (zwaar) verouderd is. Ik heb zo'n vermoeden dat dit hier ook het geval is :/.
Ik heb hem al iets aangepast maar helaas werkt hij nog steeds niet.
Als iemand mij wil zeggen welke regel code niet goed is en wat het wel moet zijn zou dat geweldig zijn.
Ik krijg nu deze error Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, string given in login.php on line 27
Call Stack
En de error zit op deze regel: $numrows=mysqli_num_rows($query);
Hier het script
<html>
<head>
<title>Login</title>
</head>
<body>
<link rel="stylesheet" href="css/style.css">
<p><a href="register.php">Register</a> | <a href="login.php">Login</a></p>
<h3>Login Formulier</h3>
<form action="" method="POST">
naam: <input type="text" name="naam"><br />
wachtwoord: <input type="wachtwoord" name="wachtwoord"><br />
<input type="submit" value="Login" name="submit" />
</form>
<?php
if(isset($_POST["submit"])){
if(!empty($_POST['naam']) && !empty($_POST['wachtwoord'])) {
$naam=$_POST['naam'];
$wachtwoord=$_POST['wachtwoord'];
$conn=mysqli_connect('localhost','root','') or die(mysqli_error());
mysqli_select_db($conn, 'vriendenboek') or die("cannot select DB");
//zoekt in de database users
$query=("SELECT * FROM users WHERE naam='".$naam."' AND wachtwoord='".$wachtwoord."'");
$result=mysqli_query ($conn,$query) ;
$numrows=mysqli_num_rows($query);
if($numrows!=0)
{
while($row=mysqli_fetch_assoc($query))
{
$dbnaam=$row['naam'];
$dbwachtwoord=$row['wachtwoord'];
}
if($naam == $dbnaam && $wachtwoord == $dbwachtwoord)
{
//start een sessie
session_start();
$_SESSION['sess_naam']=$naam;
/* gaat naar de volgende site */
header("Location: member.php");
}
} else {
echo "Ongeldige naam or wachtwoord!";
}
// niet alles ingevuld dan wordt de volgende melding getoond
} else {
echo "Alle velden dienen ingevuld te zijn!";
}
}
?>
</body>
</html>
mysqli_num_rows() expects parameter 1 to be mysqli_result, string given in login.php
Als we dit vertalen staat er: mysqli_num_rows() verwacht bij parameter 1 een mysqli_result
Jij verwijst naar $query wat alleen maar een string is. Een regeltje verder staat je $result, welke je moet gebruiken.
Los daarvan mist er wel foutafhandeling op je query. In deze tutorial wordt verteld hoe je dit op een goede manier kan aanpakken, echter moet je de mysql-functies wel even goed vertalen naar mysqli-functies.
Verder heb ik in je berichten de [code]-tags toegevoegd. Zou je deze voortaan willen toevoegen? Dan blijven de lappen scripts beter leesbaarder.