fout in query

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

PHP Newbie

PHP Newbie

18/08/2006 00:01:00
Quote Anchor link
Ben net begonnen met mysql, en ben nu bezig met een klein gastenboekje.

Mijn probleem:

Waarom mislukt deze query steeds:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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';
        }

?>


de error:
Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
 
PHP hulp

PHP hulp

12/01/2025 10:55:56
 
Frank -

Frank -

18/08/2006 00:03:00
Quote Anchor link
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 Newbie

PHP Newbie

18/08/2006 00:04:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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');
?>
 
Frank -

Frank -

18/08/2006 00:11:00
Quote Anchor link
hmmm, dat ziet er goed uit.

Dan de query:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?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.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
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.
 
PHP Newbie

PHP Newbie

18/08/2006 00:16:00
Quote Anchor link
oke thx, dit werkt:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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."')";
?>


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
 
Frank -

Frank -

18/08/2006 00:22:00
Quote Anchor link
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 *:

SELECT
kolom1,
kolom2
FROM
tabelnaam
WHERE
kolom1 = 'waarde1'
 
PHP Newbie

PHP Newbie

18/08/2006 00:24:00
Quote Anchor link
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
 
Remy Brokke

Remy Brokke

18/08/2006 00:34:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;
   }


?>


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)
PHP script in nieuw venster Selecteer het PHP script
1
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 />";
   }

?>


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
 
Frank -

Frank -

18/08/2006 00:35:00
Quote Anchor link
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.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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>';
?>

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.
 
Frank -

Frank -

18/08/2006 00:39:00
Quote Anchor link
@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.
 
Remy Brokke

Remy Brokke

18/08/2006 00:42:00
Quote Anchor link
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
 
Frank -

Frank -

18/08/2006 00:50:00
Quote Anchor link
@Remy: Ga je eens verdiepen in SQL, dat kan een hoop problemen voor je oplossen.

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
 
PHP Newbie

PHP Newbie

18/08/2006 00:51:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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)";


Dit werkt dus niet

en is dit een goede methode om de berichten te weergeven:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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 />';
        }
    }

?>
 
Frank -

Frank -

18/08/2006 00:55:00
Quote Anchor link
UNIQUE is een eigenschap van een kolom. Dat is niet iets wat de ene keer wel van toepassing is en de andere keer niet. Je gebruikt dit dus bij het aanmaken van de kolom of het wijzigen van de kolom. En niet bij het toevoegen van gegevens.

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.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo htmlentities($row['onderwerp']);
?>

Vergeet die $output.
 
PHP Newbie

PHP Newbie

18/08/2006 01:01:00
Quote Anchor link
Ah zo, oke, thx Frank,

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
)
Gewijzigd op 01/01/1970 01:00:00 door PHP Newbie
 
Remy Brokke

Remy Brokke

18/08/2006 01:02:00
Quote Anchor link
Allemaal leuk en aardig die UNIQUE, maar als ik nou deze tabel aan maak:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
    CREATE TABLE blaat (
        id int(11) auto_increment primary key,
        naam varchar(200) not null,
        leeftijd int(3) not null,
        unique key naam);
?>


En iemand geeft later een naam op die al bestaat hoe vang ik die error op? Moet dat zo:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$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
 
PHP Newbie

PHP Newbie

18/08/2006 01:05:00
Quote Anchor link
Nee, dan krijg je een error terug van mysql met een nummertje erbij.

Deze kun je opvangen met een functie, en een gepaste error geven
 
Frank -

Frank -

18/08/2006 01:09:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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.';
}

?>

Zie ook http://mysql.com/doc/refman/4.1/en/error-messages-server.html voor andere foutmeldingen.
 
PHP Newbie

PHP Newbie

18/08/2006 01:13:00
Quote Anchor link
Ik heb nu dit:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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';
        }

?>


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...
 
Frank -

Frank -

18/08/2006 01:16:00
Quote Anchor link
Logisch...

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 ;)
 
PHP Newbie

PHP Newbie

18/08/2006 01:25:00
Quote Anchor link
Zonder die or die, krijg ik: Door een technische storing....
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.