Ben net begonnen met mysql, en ben nu bezig met een klein gastenboekje.

Mijn probleem:

Waarom mislukt deze query steeds:


<?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';
        }
?>


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.
<?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');
?>
hmmm, dat ziet er goed uit.

Dan de query:
<?php
$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.

INSERT INTO
  tabelnaam(
    kolom1,
    kolom2
  )
VALUES(
  'waarde1',
  'waarde2'
)

Wanneer je dan niets in kolom1 wilt wegschrijven, dan laat je deze (samen met de value) gewoon weg.
oke thx, dit werkt:

<?php
$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
Wat versta jij onder 'dubbele berichten' ? Berichten met hetzelfde onderwerp of berichten met dezelfde datum of met exact hetzelfde bericht? Of een combinatie van de de diverse velden? Gebruik UNIQUE op de diverse losse velden of een combinatie van velden.

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 *:
[/code]
SELECT
kolom1,
kolom2
FROM
tabelnaam
WHERE
kolom1 = 'waarde1'
[/code]
Dat wist ik nog frank.

Ik bedoel alle berichten uit de database. En deze ook te weergeven.

Wat is versta onder uniek is een zelfde bericht
<?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;
}

?>

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:

<?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 />";
}
?>

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

Je hebt de volgende velden: onderwerp, datum, naam, email, bericht.

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.
<?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>';
?>
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.
@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.

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 schreef op 18.08.2006 00:39
@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 schreef op 18.08.2006 00:39
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! :)

Reageren