fout in query
Mijn probleem:
Waarom mislukt deze query steeds:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
$insert = "INSERT INTO gastenboek
VALUES (NULL,
'".$onderwerp."',
NOW(),
'".$naam."',
'".$email."',
'".$bericht."')";
$voerin = mysql_query($insert) or die(mysql_error());
if($voerin)
{
$melding2 = 'Succesvol toegevoegd';
}
else
{
$melding2 = 'Door een technische storing kon het bericht niet worden toegevoegd';
}
?>
$insert = "INSERT INTO gastenboek
VALUES (NULL,
'".$onderwerp."',
NOW(),
'".$naam."',
'".$email."',
'".$bericht."')";
$voerin = mysql_query($insert) or die(mysql_error());
if($voerin)
{
$melding2 = 'Succesvol toegevoegd';
}
else
{
$melding2 = 'Door een technische storing kon het bericht niet worden toegevoegd';
}
?>
de error:
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
Zo te zien is er geen verbinding met de database. Deze verbinding maak je in een ander deel van je script, laat dit eens zien.
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
mysql_connect ('db.pcextreme.nl','*','*')
or die ('Helaas, het gastenboek is door een storing op dit moment onbereikbaar, probeer later nog eens');
mysql_select_db('11192braam')
or die ('Helaas, het gastenboek is door een storing op dit moment onbereikbaar, probeer later nog eens');
?>
mysql_connect ('db.pcextreme.nl','*','*')
or die ('Helaas, het gastenboek is door een storing op dit moment onbereikbaar, probeer later nog eens');
mysql_select_db('11192braam')
or die ('Helaas, het gastenboek is door een storing op dit moment onbereikbaar, probeer later nog eens');
?>
Dan de query:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
$insert = "INSERT INTO gastenboek
VALUES (NULL,
'".$onderwerp."',
NOW(),
'".$naam."',
'".$email."',
'".$bericht."')"
?>
$insert = "INSERT INTO gastenboek
VALUES (NULL,
'".$onderwerp."',
NOW(),
'".$naam."',
'".$email."',
'".$bericht."')"
?>
Waarom probeer je een 'niets' in je database te zetten? En waarom schrijf je de query niet volledig uit? Het is wat meer tikwerk, maar geeft je meer zekerheid.
Wanneer je dan niets in kolom1 wilt wegschrijven, dan laat je deze (samen met de value) gewoon weg.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$insert = "INSERT INTO
gastenboek(
onderwerp,
datum,
naam,
email,
bericht)
VALUES (
'".$onderwerp."',
NOW(),
'".$naam."',
'".$email."',
'".$bericht."')";
?>
$insert = "INSERT INTO
gastenboek(
onderwerp,
datum,
naam,
email,
bericht)
VALUES (
'".$onderwerp."',
NOW(),
'".$naam."',
'".$email."',
'".$bericht."')";
?>
Nu heb ik nog 2 vragen:
Hoe kan ik het beste dubbele berichten voorkomen
Hoe kan ik het beste de berichten uitlezen uit de database
Hoe je een bericht selecteert, is afhankelijk van je doel. Wil je het netjes doen, benoem in de SELECT ieder veld die je nodig hebt, gebruik geen *:
SELECT
kolom1,
kolom2
FROM
tabelnaam
WHERE
kolom1 = 'waarde1'
Ik bedoel alle berichten uit de database. En deze ook te weergeven.
Wat is versta onder uniek is een zelfde bericht
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
$dubbeleberichten = mysql_query("SELECT * FROM gastenboek WHERE bericht = '".$bericht."'") OR DIE(mysql_error());
$tellen = mysql_num_rows($dubbeleberichten);
if($tellen >= 1)
{
echo "Dit bericht bestaat al!";
exit;
}
?>
$dubbeleberichten = mysql_query("SELECT * FROM gastenboek WHERE bericht = '".$bericht."'") OR DIE(mysql_error());
$tellen = mysql_num_rows($dubbeleberichten);
if($tellen >= 1)
{
echo "Dit bericht bestaat al!";
exit;
}
?>
Bij mysql_num_rows tel je hoeveel rijen er bestaan in de query die je net hebt uitgevoerd! :) Als die groter of gelijk is dan 1, dat betekent dan dat er al een rij bestaat waar al precies hetzelfde bericht in zit.
Je gegevens uit je database haal je zo op:
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
$sql = mysql_query("SELECT * FROM gastenboek ORDER BY 'celnaam waar je op wilt ordenen'") OR DIE(mysql_error());
while($gastenboek = mysql_fetch_array($sql));
{
echo $gastenboek['onderwerp']." geplaatst op ".$gastenboek['datum']."<br />";
echo $gastenboek['naam']." email: ".$gastenboek['email']."<br />";
echo $gastenboek['bericht']."<br />";
}
?>
$sql = mysql_query("SELECT * FROM gastenboek ORDER BY 'celnaam waar je op wilt ordenen'") OR DIE(mysql_error());
while($gastenboek = mysql_fetch_array($sql));
{
echo $gastenboek['onderwerp']." geplaatst op ".$gastenboek['datum']."<br />";
echo $gastenboek['naam']." email: ".$gastenboek['email']."<br />";
echo $gastenboek['bericht']."<br />";
}
?>
Met mysql_fetch_array() haal je alle gegevens op uit de tabel gastenboek en maak je daar een array van. Via de while lus doorloop je heel de tabel.. :)
Groetjes Remy
Gewijzigd op 01/01/1970 01:00:00 door Remy Brokke
Mag nu het veld 'onderwerp' slechts 1 x voorkomen of het veld 'datum', etc. etc. Of wil je een combinatie van velden gebruiken: op 1 datum mag slechts 1x een bepaald onderwerp voorkomen.
UNIQUE(onderwerp), UNIQUE(datum) wil zeggen dat zowel de velden 'onderwerp' als 'datum' unique moeten zijn. Gebruik je UNIQUE(onderwerp, datum) dan moet deze combinatie unique zijn. Je kan dan X-keer hetzelfde onderwerp hebben, zolang dat maar op verschillende datums is.
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
$query = "
SELECT
kolom1,
kolom2
FROM
tabelnaam
";
$result = mysql_query($query) or die(mysql_error()); // foutafhandeling moet beter
echo '<ul>'; // output netjes in een list zetten:
while($row = mysql_fetch_assoc($result)){
echo '<li>'.$row['kolom1'].' en de rest:'.$row['kolom2'].'</li>';
}
echo '</ul>';
?>
$query = "
SELECT
kolom1,
kolom2
FROM
tabelnaam
";
$result = mysql_query($query) or die(mysql_error()); // foutafhandeling moet beter
echo '<ul>'; // output netjes in een list zetten:
while($row = mysql_fetch_assoc($result)){
echo '<li>'.$row['kolom1'].' en de rest:'.$row['kolom2'].'</li>';
}
echo '</ul>';
?>
Met mysql_num_rows() kun je eerst nog even checken of er resultaten zijn en dan pas de while starten of een andere melding geven.
Of je moet na de SELECT de tabel gaan locken om een INSERT van een andere gebruiker te voorkomen. Pas nadat jouw INSERT klaar is, geef je de tabel weer vrij. Lijkt mij niet wenselijk en is volkomen overbodig. Dit kan overigens ook niet met MyISAM omdat TRANSACTIONS ontbreken. innoDB kent wel TRANSACTIONS en is dan ook de betere database-engine in MySQL.
Frank:
@Remy: Jouw oplossing is niet betrouwbaar. Er bestaat een kans dat er tussen de SELECT en INSERT-query een andere INSERT plaatsvindt. Dan kunnen er alsnog dubbele records in de database terecht komen. Het gebruik van UNIQUE is de enige juiste oplossing.
Ik had nog nooit gehoord van UNIQUE gehoord! Wel erg handig, en het voorkomt heel veel php geblaat! Bedankt! :)
Frank:
Dit kan overigens ook niet met MyISAM omdat TRANSACTIONS ontbreken. innoDB kent wel TRANSACTIONS en is dan ook de betere database-engine in MySQL.
En hier snap ik dus geen ene flikker van! :)
Gewijzigd op 01/01/1970 01:00:00 door Remy Brokke
http://www.firstsql.com/tutor.htm
http://www.sql.org/sql-database/postgresql/manual/tutorial-transactions.html
Nogmaals: MyISAM ondersteunt géén transactions en is ook verder een brakke database-engine. Wil je MySQL gebruiken, gebruik dan in elk geval innoDB en de meest recente versies van MySQL, 5.0 of 5.1
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$insert = "INSERT INTO
gastenboek(
onderwerp,
datum,
naam,
email,
bericht)
VALUES (
'".$onderwerp."',
NOW(),
'".$naam."',
'".$email."',
'".$bericht."')
UNIQUE (
bericht)";
gastenboek(
onderwerp,
datum,
naam,
email,
bericht)
VALUES (
'".$onderwerp."',
NOW(),
'".$naam."',
'".$email."',
'".$bericht."')
UNIQUE (
bericht)";
Dit werkt dus niet
en is dit een goede methode om de berichten te weergeven:
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
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
<?php
$selecteer = "SELECT * FROM gastenboek ORDER BY id DESC";
$res = mysql_query($selecteer);
if (mysql_num_rows($res) >= 1)
{
while ($row = mysql_fetch_array($res))
{
$output['naam'] = htmlentities($row['naam']);
$output['email'] = htmlentities($row['email']);
$output['datum'] = htmlentities($row['datum']);
$output['onderwerp'] = htmlentities($row['onderwerp']);
$output['bericht'] = htmlentities($row['bericht']);
$output['bericht'] = nl2br($output['bericht']);
echo '<br /><b>'.$output['onderwerp'].'</b><br />';
if($output['email'] == 'niet opgegeven')
{
echo '<nolink>'.$output['naam'].'</nolink> ('.$output['datum'].')';
}
else
{
echo '<a href="mailto:'.$output['email'].'">'.$output['naam'].'</a> ('.$output['datum'].')<br />';
}
echo $output['bericht'].'<br />';
}
}
?>
$selecteer = "SELECT * FROM gastenboek ORDER BY id DESC";
$res = mysql_query($selecteer);
if (mysql_num_rows($res) >= 1)
{
while ($row = mysql_fetch_array($res))
{
$output['naam'] = htmlentities($row['naam']);
$output['email'] = htmlentities($row['email']);
$output['datum'] = htmlentities($row['datum']);
$output['onderwerp'] = htmlentities($row['onderwerp']);
$output['bericht'] = htmlentities($row['bericht']);
$output['bericht'] = nl2br($output['bericht']);
echo '<br /><b>'.$output['onderwerp'].'</b><br />';
if($output['email'] == 'niet opgegeven')
{
echo '<nolink>'.$output['naam'].'</nolink> ('.$output['datum'].')';
}
else
{
echo '<a href="mailto:'.$output['email'].'">'.$output['naam'].'</a> ('.$output['datum'].')<br />';
}
echo $output['bericht'].'<br />';
}
}
?>
Opmerking: gebruik htmlentities() daar waar je het nodig hebt. En niet om nog een nieuw setje variabelen aan te maken, dat is volkomen overbodig. Vreet alleen maar geheugen.
Vergeet die $output.
Maar hoe krijg ik die unique nu in mijn database?
Ik heb in PHPMyAdmin al UNIQUE bericht geprobeerd, maar toen had ik een error in mijn mysql syntax
Edit:
gelukt:
ALTER TABLE gastenboek ADD UNIQUE (
bericht
)
gelukt:
ALTER TABLE gastenboek ADD UNIQUE (
bericht
)
Gewijzigd op 01/01/1970 01:00:00 door PHP Newbie
Code (php)
En iemand geeft later een naam op die al bestaat hoe vang ik die error op? Moet dat zo:
Code (php)
1
2
3
2
3
<?php
$sql = mysql_query("INSERT INTO blaat (naam) VALUES (".$_POST['naam'].")") OR DIE("Deze naam bestaat al!");
?>
$sql = mysql_query("INSERT INTO blaat (naam) VALUES (".$_POST['naam'].")") OR DIE("Deze naam bestaat al!");
?>
Ik zou niet weten hoe het anders moet.. :)
Gewijzigd op 01/01/1970 01:00:00 door Remy Brokke
Deze kun je opvangen met een functie, en een gepaste error geven
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
$result = mysql_query($sql);
if(mysql_errno($sql) == 1062){ // let op de functie mysql_errno() !
echo 'Naam bestaat al.';
}
elseif (!$sql){
echo mysql_error();
}
else{
echo 'Naam toegevoegd.';
}
?>
$result = mysql_query($sql);
if(mysql_errno($sql) == 1062){ // let op de functie mysql_errno() !
echo 'Naam bestaat al.';
}
elseif (!$sql){
echo mysql_error();
}
else{
echo 'Naam toegevoegd.';
}
?>
Zie ook http://mysql.com/doc/refman/4.1/en/error-messages-server.html voor andere foutmeldingen.
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
$voerin = mysql_query($insert) or die(mysql_error());
if(mysql_errno($voerin) == 1062)
{
$melding2 = 'Precies ditzelfde bericht is al eerder gepost, dit kan geen toeval zijn.';
}
elseif($voerin)
{
$melding2 = 'Succesvol toegevoegd';
unset($_SESSION['contactform']);
}
else
{
$melding2 = 'Door een technische storing kon het bericht niet worden toegevoegd';
}
?>
$voerin = mysql_query($insert) or die(mysql_error());
if(mysql_errno($voerin) == 1062)
{
$melding2 = 'Precies ditzelfde bericht is al eerder gepost, dit kan geen toeval zijn.';
}
elseif($voerin)
{
$melding2 = 'Succesvol toegevoegd';
unset($_SESSION['contactform']);
}
else
{
$melding2 = 'Door een technische storing kon het bericht niet worden toegevoegd';
}
?>
maar als ik een dubbel bericht invoer krijg ik:
Duplicate entry 'Dit is een test om te kijken of alles werkt' for key 'bericht'
en geen nette error...
Regel 2: or die(mysql_error());
Jouw script komt dus nooit toe aan de nette foutafhandeling, alleen de brute 'or die()'.
Het is al laat ;)
Zonder die or die, krijg ik: Door een technische storing....