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>

Warning: mysqli_select_db() expects exactly 2 parameters, 1 given

dus: de functie mysqli_select_db() verwacht 2 parameters. Jij geeft er maar 1.

en dan een regelnummer.

De eerste parameter is $con
De 2e heb je al

zie http://php.net/mysqli-select-db



[size=xsmall]Toevoeging op 14/12/2015 14:55:44:[/size]

en daarna krijg je eenzelfde melding over mysqli_query()

het verschil tussen mysql_xyz() en mysqli_xyz() is niet alleen die extra i, maar de parameters staan in een andere volgorde en zijn vaker verplicht.

[size=xsmall]Toevoeging op 14/12/2015 14:56:50:[/size]

enne
wachtwoorden sla je toch niet letterlijk (ongehashd) op in de database he....
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.
Even wat als opbouwende kritiek bedoelde opmerkingen:

Wat is de reden van regel 5 en 6?

Sla je wachtwoorden zonder enige vorm van beveiliging op in de database?

session_start kun je beter altijd helemaal boven aan je script neer zetten.

Na een header altijd een exit plaatsen.

Regel 14 suggereert dat er meerdere combinaties mogelijk zijn van naam/wachtwoord. Lijkt me dat er maximaal 1 combinatie mogelijk is.

Volgens mij is er dan ook geen while nodig op regel 16

De vergelijking op regel 22 begrijp ik niet --> je hebt al gecontroleerd of naam/wachtwoord overeen komt in je select query.

Waarom een * in je select query? Je wilt (maar) 2 velden opvragen --> benoem die.
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.
"Kun je me aangeven welke ik mis? De connectie naar de database toe?"

Dat zeg ik: $con
Volgens mij staat die toch op lijn 8 of bedoel je die niet?
de vergelijking op regel 22 is zinnig, voor het geval iemand als username opgeeft:


jan' or 1=1 or '1'='1


In dat geval krijg je namelijk alle records terug, maar dan komt er alsnog de controle voor het password overheen....

(of je past gewoon escaping toe op de user invoer.

http://wiki.pfz.nl/sqlinjectie )



[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?"

Wel, dat is dus de verbinding $con.
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.

Reageren