Double records
In mijn vorige topic probeerde ik te checken of een record al bestaat in een tabel.
Dit was me na veel uren proberen niet gelukt. Ik heb het een beetje aangepast en krijg nu een nieuwe error.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$username="root";
$password="********";
$database="Wizzardz";
mysql_connect(localhost,$username,$password);
@mysql_select_db($database) or die( "Unable to select database");
$result = mysql_query("INSERT INTO account (Nickname) VALUES ('pipooo')");
$num_rows = mysql_num_rows($result);
echo "$num_rows";
mysql_close();
?>
$username="root";
$password="********";
$database="Wizzardz";
mysql_connect(localhost,$username,$password);
@mysql_select_db($database) or die( "Unable to select database");
$result = mysql_query("INSERT INTO account (Nickname) VALUES ('pipooo')");
$num_rows = mysql_num_rows($result);
echo "$num_rows";
mysql_close();
?>
Hierna komt natuurlijk nog het stukje waarin staat dat dat het aantal rijen niet groter mag zijn dan 0, want in dat geval bestaat er al een account met die naam. Nu krijg ik deze error:
Quote:
Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\WizzardzAccountCreateCode.php on line 19
Hij zegt dus dat het een boolean is terwijl het een int moet zijn. Wat doe ik fout?
Heel erg bedankt alvast! ^^
De fout zit in regel 19. Lijkt me handig dat je die dan ook even post.
Retrieves the number of rows from a result set. This command is only valid for statements like SELECT or SHOW that return an actual result set. To retrieve the number of rows affected by a INSERT, UPDATE, REPLACE or DELETE query, use mysql_affected_rows().
Maar num_rows = mysql_affected_rows($result); werkt net zo min sorry
$num_rows = mysql_affected_rows();
Daardoor raak je zelf in verwarring.
Het is geen goed idee een return van een mysql_query() $result te noemen.
mysql_query() geeft je een resource weer. Daarom wordt het meestal $res genoemd.
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
// een vrij gebruikelijke vorm
$sql = "SELECT ... FROM ...";
$res = mysql_query($sql);
while ($row = mysql_fetch_assoc($res)) {
...
}
?>
// een vrij gebruikelijke vorm
$sql = "SELECT ... FROM ...";
$res = mysql_query($sql);
while ($row = mysql_fetch_assoc($res)) {
...
}
?>
Die resource wordt dus teruggegeven bij een SELECT. Daar kan je dan ook informatie uit fetchen.
Bij een insert krijg je geen resource terug.
mysql_affected_rows() vraagt dus niet om een resource van (de return van) een INSERT of UPDATE ..., maar vraagt je de database link.
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
...
$sql = "INSERT INTO ...";
if(mysql_query($sql) {
$number_of_inserts = mysql_affected_rows($link);
}
?>
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
...
$sql = "INSERT INTO ...";
if(mysql_query($sql) {
$number_of_inserts = mysql_affected_rows($link);
}
?>
Gewijzigd op 25/01/2011 11:16:20 door Kris Peeters
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$username="root";
$password="";
$database="Wizzardz";
$link = mysql_connect(localhost,$username,$password);
@mysql_select_db($database) or die( "Unable to select database");
$sql = "SELECT Nickname FROM accounts";
$res = mysql_query($sql);
if(mysql_query($sql)) {
$number = mysql_affected_rows($link);
}
echo "$number";
?>
$username="root";
$password="";
$database="Wizzardz";
$link = mysql_connect(localhost,$username,$password);
@mysql_select_db($database) or die( "Unable to select database");
$sql = "SELECT Nickname FROM accounts";
$res = mysql_query($sql);
if(mysql_query($sql)) {
$number = mysql_affected_rows($link);
}
echo "$number";
?>
Ozzie PHP op 25/01/2011 11:06:09:
En zo?
$num_rows = mysql_affected_rows();
$num_rows = mysql_affected_rows();
mysql_affected_rows vraagt inderdaad om de link van de database, maar bij een SELECT moet je die niet gebruiken, daar gebruik je mysql_num_rows
Daarmee heb ik dit gemaakt: en volgens mij werkt het!
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
$username="root";
$password="";
$database="Wizzardz";
mysql_connect(localhost,$username,$password);
@mysql_select_db($database) or die( "Unable to select database");
$res = (mysql_query("INSERT INTO account (Nickname) VALUES ('pipah')"));
$num_rows = mysql_affected_rows();
if ($num_rows < 0) {
echo "bestaat wel";
} else {
echo "bestaat niet";
}
mysql_close();
?>
$username="root";
$password="";
$database="Wizzardz";
mysql_connect(localhost,$username,$password);
@mysql_select_db($database) or die( "Unable to select database");
$res = (mysql_query("INSERT INTO account (Nickname) VALUES ('pipah')"));
$num_rows = mysql_affected_rows();
if ($num_rows < 0) {
echo "bestaat wel";
} else {
echo "bestaat niet";
}
mysql_close();
?>
Bram unknown op 25/01/2011 11:53:28:
Ozzy sorry jouw comment probeerde ik als tweede. xD
Daarmee heb ik dit gemaakt: en volgens mij werkt het!
Daarmee heb ik dit gemaakt: en volgens mij werkt het!
Uiteraard werkt het ;-)
Jij ook kris! Jij deed eigenlijk veel meer moeite.
Het enige probleem is volgens mij dat num_rows ipv affected_rows alle tabellen geeft en niet alleen met die value.
Hoewel het kan zijn dat het wel lukt als je SELECT gebruikt.
Igg heel erg bedankt allemaal!
Je kunt je niet voorstellen hoe blij ik ben na al die uren proberen x'D
Je kan 20 query's uitvoeren, die je in 20 verschillende resource variabelen zet.
Achteraf kan je van die resource met num_rows zien hoeveel rijen er zijn. Je hebt daar geen verbinding met de database meer voor nodig.
Met INSERT lukt dat niet.
mysql_affected_rows Zal je enkel vertellen wat de laatste actie was van mysql. Dit moet dan ook gebeuren onmiddellijk na het uitvoeren van de query.
Dit vergt ook een verbinding met de database.
Gewijzigd op 25/01/2011 12:09:26 door Kris Peeters
Het zou wel fijn zijn als ik deze manier kan gebruiken. Ook vanwege wat andere redenen.
Ik weet dat ik een zeurpiet ben maar zou je me misschien net iets verder kunnen helpen daar mee want ik krijg het niet voor elkaar.
Toevoeging op 25/01/2011 14:24:43:
Dit is zo ver als ik kom, maar ik weet niet hoe ik nu nog het aantal rijen met die ene nickname kan zien.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$username="root";
$password="";
$database="Wizzardz";
$link = mysql_connect(localhost,$username,$password);
@mysql_select_db($database) or die( "Unable to select database");
$sql = mysql_query("SELECT Nickname FROM account") or die("Cant find nickname table");
$res = mysql_num_rows($sql);
echo "$res";
?>
$username="root";
$password="";
$database="Wizzardz";
$link = mysql_connect(localhost,$username,$password);
@mysql_select_db($database) or die( "Unable to select database");
$sql = mysql_query("SELECT Nickname FROM account") or die("Cant find nickname table");
$res = mysql_num_rows($sql);
echo "$res";
?>
PM hier en daar:
Re: Dubbele gegevens in mysql
Gelezen op: 25.01.2011 00:11:43
Ontvanger: Bram unknown
Dat is nogal wiedes hé dat dat niet werkt.
Ik zei dat je moest kijken wat mysql_query teruggaf. En testen wat mysql_error / mysql_errno teruggaf.
> Hey,
>
> Nog even over die dubbele gegevens in mysql.
> Ik wilde kijken of een username al bestond in de database.
>
> De manier die jij vertelde was volgens mij met try en catch.
>
> Hoe werkt dit precies? want dit:
>
>
Quote:
try {
> $sql = "INSERT INTO account (Nickname) VALUES ('lalala')";
> }
> catch(Exception $e) {
> echo $e->getMessage();
> }
>
> Werkt blijkbaar niet.
>
> Alvast bedankt!
Gelezen op: 25.01.2011 00:11:43
Ontvanger: Bram unknown
Dat is nogal wiedes hé dat dat niet werkt.
Ik zei dat je moest kijken wat mysql_query teruggaf. En testen wat mysql_error / mysql_errno teruggaf.
> Hey,
>
> Nog even over die dubbele gegevens in mysql.
> Ik wilde kijken of een username al bestond in de database.
>
> De manier die jij vertelde was volgens mij met try en catch.
>
> Hoe werkt dit precies? want dit:
>
>
Quote:
try {
> $sql = "INSERT INTO account (Nickname) VALUES ('lalala')";
> }
> catch(Exception $e) {
> echo $e->getMessage();
> }
>
> Werkt blijkbaar niet.
>
> Alvast bedankt!
Waarom ga je dan nog steeds die onzin doen?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
// Configuratie
$db_user = 'root';
$db_password = '';
$db_server = 'localhost';
$db_database = 'Wizzardz'; // Lekker dubbelzinnige naam
$link = mysq_connect($db_server, $db_user, $db_password); // Dit is een resource
if($link) // on the fly type cating van php
{
// We hebben verbinding
if(mysql_select_db($db_database, $link))
{
// We kunnen een database selecteren
$query = "INSERT INTO account (Nickname) VALUES ('pipooo')"; // Values met mysql_real_escape_string erin stoppen als ze van de gebruiker vandaan komen en met sprintf
if(mysql_query($query, $link)) // Het is een insert dus of true of false
{
echo 'Insert is gelukt!'; // Afhandelen via template parser
}
else
{
echo 'Insert is mislukt!';
var_dump(mysql_error($link), mysql_errno($link)); // Dit is alleen voor testen. Kijk wat je hieruit krijgt. Daarmee kan je checks doen.
// TOON NOOIT (my)sql FOUTEN OF PHP FOUTEN AAN DE GEBRUIKER!
}
}
else
{
echo 'Db selecteren was niet mogelijk. Nu doen we nette foutafhandeling, dus geen die';
}
mysql_close($link); // Altijd net
}
else
{
echo 'Help, we kunnen niks. Maar weer geen die';
}
?>
// Configuratie
$db_user = 'root';
$db_password = '';
$db_server = 'localhost';
$db_database = 'Wizzardz'; // Lekker dubbelzinnige naam
$link = mysq_connect($db_server, $db_user, $db_password); // Dit is een resource
if($link) // on the fly type cating van php
{
// We hebben verbinding
if(mysql_select_db($db_database, $link))
{
// We kunnen een database selecteren
$query = "INSERT INTO account (Nickname) VALUES ('pipooo')"; // Values met mysql_real_escape_string erin stoppen als ze van de gebruiker vandaan komen en met sprintf
if(mysql_query($query, $link)) // Het is een insert dus of true of false
{
echo 'Insert is gelukt!'; // Afhandelen via template parser
}
else
{
echo 'Insert is mislukt!';
var_dump(mysql_error($link), mysql_errno($link)); // Dit is alleen voor testen. Kijk wat je hieruit krijgt. Daarmee kan je checks doen.
// TOON NOOIT (my)sql FOUTEN OF PHP FOUTEN AAN DE GEBRUIKER!
}
}
else
{
echo 'Db selecteren was niet mogelijk. Nu doen we nette foutafhandeling, dus geen die';
}
mysql_close($link); // Altijd net
}
else
{
echo 'Help, we kunnen niks. Maar weer geen die';
}
?>
Dit tik ik zo uit mijn hoofd, terwijl ik nooit mysql functies gebruik. Alle informatie kan je zo vinden op de php pagina's. Dat zijn dus die linkies in dat script hierboven. Als je daar op klikt dan kom je op php.net uit. Dat is de handleiding. Het mooie aan de handleiding is dat je ook voorbeelden hebt. Zie ze. Vergelijk dit script met dat.
Het enige wat jij dus nu moet doen is kijken wat voor mysql error je krijgt.
Gast sorry voor mijn gezeik van eerder ik kon het gewoon niet voor elkaar krijgen en wilde niet meer verder janken.
Iig, ik kan je echt niet genoeg bedanken want hij werkt nu perfect.
Echt fck erg bedankt! ^^
Om te checken of een record al bestaat, werkt het volgens mij het beste als je je veld de UNIQUE eigenschap meegeeft. Als je dan probeert te inserten in je tabel, en hij werkt niet omdat een UNIQUE-error optreedt (omdat er al eenzelfde record bestaat), weet je genoeg. Maar gelukkig werkt ie al, zie ik :).
Stephan G op 07/02/2011 00:58:11:
Om te checken of een record al bestaat, werkt het volgens mij het beste als je je veld de UNIQUE eigenschap meegeeft. Als je dan probeert te inserten in je tabel, en hij werkt niet omdat een UNIQUE-error optreedt (omdat er al eenzelfde record bestaat), weet je genoeg. Maar gelukkig werkt ie al, zie ik :).
Het script hierboven, van mij, gaat er ook inderdaad vanuit dat in de database het veld UNIQUE of primair is.