[PHP] Maakt incorrecte headers voor mail()

Pagina: 1
Acties:
  • 258 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Topicstarter
Middels onderstaande code, vorm ik headers voor een mailtje.
Dit mailtje is opgeslagen in een database en na een verificatie mailtje met daarin de link en activatie-code, word het feitelijke mailtje écht verstuurd.

Echter word het mailtje (nog) niet verstuurd, en dat is omdat de (extra) headers niet op orde zijn.
Ik heb gedacht dat het aan escaping lag, maar dit is niet het geval geweest.
Zowel bij '. $var .' en ". $var ." lukt het niet om een correcte header weergave te maken.

PHP:
1
2
3
4
5
6
$eol = "\r\n";
$headers = 'From: '. $mailer['naam'] .' <'. $mailer['email'] .'>'.$eol;
$headers .= 'Reply-To: '. $mailer['naam'] .' <'. $mailer['email'] .'>'.$eol;
$headers .= 'Return-Path: '. $mailer['naam'] .' <'. $mailer['email'] .'>'.$eol;
$headers .= 'Message-ID: <'. $_GET['code'] .'mailer@'.$_SERVER['SERVER_NAME'].'>'.$eol;
$headers .= 'X-Mailer: PHP v'.phpversion().$eol;
Ik heb de headers laten echo'en en krijg dan onderstaande (extra) headers eruit:
From: GJ 
Reply-To: GJ 
Return-Path: GJ 
Message-ID: <0e7d754e1a42e07249117693f0fd4c94mailer@www.domein.tld>
X-Mailer: PHP v5.1.2
Als ik een uitdraai maak van $mailer, middels
PHP:
1
2
3
echo '<pre>';
print_r($mailer);
echo '</pre>';
Dan heeft $mailer['email'] wel degelijk een waarde, dus het afvangen van de kan van SQL is gewoon goed.
Ook het mailen zelf binnen de while-loop zetten heeft geen zin, ook dan werkt het niet.
Wat is trouwens 'semantisch' / performance wise gezien daarvoor de beste oplossing?
Gewoon binnen de while-loop zetten, of los, zoals ik het nu opgelost heb?

Iemand die weet wat er hier aan de hand is, en hoe ik dit (voornamelijk het probleem van de headers) op kan lossen?

Ik heb overigens nog niet geprobeert om zonder de extra headers te mailen, dit kan ik vanavond pas testen of er dan wel gemailt word, waar ik overigens wel van uit ga dat dat wel lukken zal.
Ik wil gewoon deze extra headers meegeven, zodat een reactie bij de échte afzender terecht komt en om zekerder te zijn, dat een mailtje niet gemarkeerd word als zijnde spam.

[ Voor 9% gewijzigd door CH4OS op 28-03-2007 13:58 ]


Acties:
  • 0 Henk 'm!

  • x-force
  • Registratie: Maart 2001
  • Laatst online: 05-01-2024
Zou je de output van je tweede php stukje kunnen posten. Of misschien wat meer code rond het eerste stukje. Zoals het er nu staat moet het werken. Zoals je aangeeft werkt het niet en is het moeilijk om aan te geven wat er fout gaat.

VangenopBetaalwater.nl Het platform om ervaringen over betaalwater in Frankrijk te delen met andere karpervissers zodat iedereen kan vangen op betaalwater!


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Topicstarter
x-force schreef op woensdag 28 maart 2007 @ 14:02:
Zou je de output van je tweede php stukje kunnen posten. Of misschien wat meer code rond het eerste stukje. Zoals het er nu staat moet het werken. Zoals je aangeeft werkt het niet en is het moeilijk om aan te geven wat er fout gaat.
Het stukje wat ervoor staat, is het SQL gedeelte, die de gegevens aan de hand van de (verificatie) code, de persoon, emailadres en het bericht ophaalt en in $mailer array zet.
Dit stuk gaat (zoals gezegt) gewoon goed, als ik
PHP:
1
2
3
echo '<pre>';
print_r($mailer);
echo '</pre>';
doe, zie ik ook dat elke rij een waarde heeft.
De spullen worden dus wél goed uit SQL gehaalt, echter worden de emailadressen niet ingevult, zoals je kan zien in de output die ik krijg van de $headers. Momenteel kan ik hier nog even geen uitdraai van maken, dit zal ik ook vanavond even doen voor je.

Wat er dus fout gaat, weet ik ook niet precies, maar voor hetgeen ik zie, zou ik zeggen dat $mailer['email'] niet ingevult word, terwijl deze wel bestaat (en zeker niet leeg is)

Acties:
  • 0 Henk 'm!

  • x-force
  • Registratie: Maart 2001
  • Laatst online: 05-01-2024
Je geeft nu niet meer code. De code die er staat is goed. Zo kunnen wij niet gokken waar het fout gaat. Misschien kun je een groter deel van je script tonen?

Je geeft aan dat $mailer['email'] leeg is maar wel goed wordt opgehaald. Dus tussen het vullen van de var en het tonen van de var gaat wat fout. Dit deel toon jij niet en is het dus ook onmogelijk om te zeggen wat er fout gaat.

VangenopBetaalwater.nl Het platform om ervaringen over betaalwater in Frankrijk te delen met andere karpervissers zodat iedereen kan vangen op betaalwater!


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Topicstarter
Het stukje wat ik ervoor heb zitten is dit:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$query = "SELECT `naam`, `email`, `onderwerp`, `bericht` FROM `mails` WHERE `code` = '". $_GET['code'] ."'";
$result = mysql_query($query);
if(!$result)
{
    echo 'Kon query niet uitvoeren: '. mysql_error();
}
else
{
    $num_rows = mysql_num_rows($result);
    if($num_rows == 1)
    {
        while($row = mysql_fetch_assoc($result))
        {               
            $mailer = $row;                 
        }

    }
}
Tis wel even een versimpeling, de check op $_GET['code'] is de 'root'-actie, word connectie gemaakt met MySQL en daarna begint ie dit stukje code te doorlopen.
Als ik dus de gegevens in wil vullen in de headers, dan gaat het fout.
De naam word, zoals in de TS ook te zien is, wel ingevult, maar het mailadres en de < > er omheen mist, voor de rest worden de headers dus wél gevult, zoals je ziet in de headers... ;)

Concreet heb ik dus
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
$query = "SELECT `naam`, `email`, `onderwerp`, `bericht` FROM `mails` WHERE `code` = '". $_GET['code'] ."'";
$result = mysql_query($query);
if(!$result)
{
    echo 'Kon query niet uitvoeren: '. mysql_error();
}
else
{
    $num_rows = mysql_num_rows($result);
    if($num_rows == 1)
    {
        while($row = mysql_fetch_assoc($result))
        {               
            $mailer = $row;                 
        }

    }
}

$eol = "\r\n";
$headers = 'From: '. $mailer['naam'] .' <'. $mailer['email'] .'>'.$eol;
$headers .= 'Reply-To: '. $mailer['naam'] .' <'. $mailer['email'] .'>'.$eol;
$headers .= 'Return-Path: '. $mailer['naam'] .' <'. $mailer['email'] .'>'.$eol;
$headers .= 'Message-ID: <'. $_GET['code'] .'mailer@'.$_SERVER['SERVER_NAME'].'>'.$eol;
$headers .= 'X-Mailer: PHP v'.phpversion().$eol;
Het maakt ook niet uit, of ik het mail stukje (vanaf het declareren $eol tot en met de laatste regel) in de while loop zelf zet.
Ook dan komen de headers eruit zoals eerder aangegeven.

[ Voor 53% gewijzigd door CH4OS op 28-03-2007 15:37 ]


Acties:
  • 0 Henk 'm!

Verwijderd

GJ-tje schreef op woensdag 28 maart 2007 @ 15:23:
..
De naam word, zoals in de TS ook te zien is, wel ingevult, maar het mailadres en de < > er omheen mist, voor de rest worden de headers dus wél gevult, zoals je ziet in de headers... ;)
Om even het basisgeval uit te sluiten, bekijk je de headers toevallig via een webbrowser? Zit het email-adres dan ook niet in de source van de webpagina?

Acties:
  • 0 Henk 'm!

  • TheRookie
  • Registratie: December 2001
  • Niet online

TheRookie

Nu met R1200RT

dacht ik idd ook al, maar dan had de waarde van Message-ID: toch ook niet zichtbaar moeten zijn ?

Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Topicstarter
Verwijderd schreef op woensdag 28 maart 2007 @ 15:31:
Om even het basisgeval uit te sluiten, bekijk je de headers toevallig via een webbrowser? Zit het email-adres dan ook niet in de source van de webpagina?
Ik heb de $headers variabele laten echo'n (middels print_r()) tussen preformatted tekst tags... ;) Dan kan ik er toch wel van uit gaan, dat een email adres en de < > dan weergegeven worden?

Want het vreemdste is wel, dat de naam wel gewoon weergegeven word, echter het mail adres niet... ;)

Acties:
  • 0 Henk 'm!

Verwijderd

TheRookie schreef op woensdag 28 maart 2007 @ 15:38:
dacht ik idd ook al, maar dan had de waarde van Message-ID: toch ook niet zichtbaar moeten zijn ?
Dat dacht ik dus ook, maar na een testje gedaan te hebben blijkt dat dus fout te zijn.
GJ-tje schreef op woensdag 28 maart 2007 @ 15:38:
[...]
Ik heb de $headers variabele laten echo'n (middels print_r()) tussen preformatted tekst tags... ;) Dan kan ik er toch wel van uit gaan, dat een email adres en de < > dan weergegeven worden?
..
Assumption is the mother of all fuck-ups :)
Check de source van dit testje maar, het email-adres wordt gewoon niet getoond.

Acties:
  • 0 Henk 'm!

  • TheRookie
  • Registratie: December 2001
  • Niet online

TheRookie

Nu met R1200RT

helaas dus niet:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
$mailer['naam']="Naam";
$mailer['email']="test@domain.tld";
$_GET['code']="1234564789";
$_SERVER['SERVER_NAME']="website.tld";

$eol = "\r\n";
$headers = 'From: '. $mailer['naam'] .' <'. $mailer['email'] .'>'.$eol;
$headers .= 'Reply-To: '. $mailer['naam'] .' <'. $mailer['email'] .'>'.$eol;
$headers .= 'Return-Path: '. $mailer['naam'] .' <'. $mailer['email'] .'>'.$eol;
$headers .= 'Message-ID: <'. $_GET['code'] .'mailer@'.$_SERVER['SERVER_NAME'].'>'.$eol;
$headers .= 'X-Mailer: PHP v'.phpversion().$eol;
print("<pre>$headers</pre>");

resultaat in 'browser'
code:
1
2
3
4
5
From: Naam 
Reply-To: Naam 
Return-Path: Naam 
Message-ID: <1234564789mailer@website.tld>
X-Mailer: PHP v5.1.2


resultaat in source
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
X-Powered-By: PHP/5.1.2
Set-Cookie: DBGSESSID=0492645940000001@clienthost:7869;path=/;
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-type: text/html

<pre>From: Naam <test@domain.tld>
Reply-To: Naam <test@domain.tld>
Return-Path: Naam <test@domain.tld>
Message-ID: <1234564789mailer@website.tld>
X-Mailer: PHP v5.1.2
</pre>

:w heidekneus :P
offtopic:
favo quote van een ex-collega:
when you assume you make an ass out of you and me

[ Voor 3% gewijzigd door TheRookie op 28-03-2007 15:48 ]


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Topicstarter
Vind het vreemd dat de browser dat dan niet weergeeft, wat zou hiervan de reden (kunnen) zijn? :?
En waardoor mailt PHP dan niet, als ik deze gegevens wel zou hebben? :?
Want mail() geeft namelijk wel een false terug? :?

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:47

Creepy

Tactical Espionage Splatterer

Als PHP niet mailt dan is er misschien geen mailserver geconfigureerd. Maar dat weet jij beter dan wij ;)

Daarnaast is het zo dat de meeste browsesrs onbekende tags niet tonen. Laat een tag nu altijd beginnen met een < en eindigen met een > dus dan is het niet zo gek dat je deze niet ziet.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

Verwijderd

GJ-tje schreef op woensdag 28 maart 2007 @ 16:49:
Vind het vreemd dat de browser dat dan niet weergeeft, wat zou hiervan de reden (kunnen) zijn? :?
En waardoor mailt PHP dan niet, als ik deze gegevens wel zou hebben? :?
Want mail() geeft namelijk wel een false terug? :?
<pre> zorgt ervoor dat de inhoud "preformatted" wordt getoond. Nieuwe regels, spaties en tabs worden dan overgenomen bij het renderen van tekst enzo. Er staat nergens dat alle broncode die binnen <pre> en </pre> staat getoond moet worden. En dat slaat ook nergens op. Je hebt alles maar gewoon te escapen. Dat hoort, dat is normaal, en dat is logisch.

Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Topicstarter
Creepy schreef op woensdag 28 maart 2007 @ 17:17:
Als PHP niet mailt dan is er misschien geen mailserver geconfigureerd. Maar dat weet jij beter dan wij ;)
Ja, binnen PHP is een mailserver geconfigureerd.
Een ander gedeelte van het script (het posten van de naam, onderwerp, het bericht en uiteraard het email adres) verzend ook een mailtje. Deze stuurt dan een mailtje (Joh :9) naar de gebruiker, met daarin de link waarmee hij naar ons zijn email adres bevestigd, zodat wezeker er van zijn, dat wij weer contact kunnen opnemen met de gebruiker... ;)
Daarnaast is het zo dat de meeste browsesrs onbekende tags niet tonen. Laat een tag nu altijd beginnen met een < en eindigen met een > dus dan is het niet zo gek dat je deze niet ziet.
Dat is waar ook, dat ik daar niet aan dacht! 8)7
Verwijderd schreef op woensdag 28 maart 2007 @ 18:04:
<pre> zorgt ervoor dat de inhoud "preformatted" wordt getoond. Nieuwe regels, spaties en tabs worden dan overgenomen bij het renderen van tekst enzo. Er staat nergens dat alle broncode die binnen <pre> en </pre> staat getoond moet worden. En dat slaat ook nergens op. Je hebt alles maar gewoon te escapen. Dat hoort, dat is normaal, en dat is logisch.
Dankjewel voor de uitleg voor wat betreft de <pre>-tag, weer wat geleerd vandaag! :) En wat betreft jouw laatste zin, die zet ik in mijn sig, vind het wel wat hebben :+ :9

Ik ben nu overigens aan het testen, of hij mailt als ik die extra headers uit heb staan.
Als hij dat doet, dan ligt dat aan de headers (maar als ik hier zo lees, dan denk ik niet dat dat het geval is, anders is het echt een foutje die ik maak met mail() zelf... ;)


Heb zojuist getest, ook zonder de headers word het mailtje niet verstuurd.
Ik heb dus een foutje in mijn mail() regel, maar welke? Zou dat komen, omdat ik het onderwerp en het bericht niet met escaping in de mail toevoeg? Lijkt me stug toch? :?

-----------

Ik heb nu
PHP:
1
$mail = mail('mail@domein.tld', $row['onderwerp'], $row['bericht']);
als regel om te mailen, en dit werkt wel... :?
Echter krijg ik dan geen subject en geen bericht in de mail? :? (de regel zit binnen de while-loop overigens momenteel... ;)

-----------

Weer een testje verder.
Heb net de headers toegevoegt in de mail en ook dit werkt.
Nu moet ik alleen nog het bericht checken, waarom die niet in de mail komt te staan en het onderwerp.

-----------

En ik heb het opgelost!
Ik heb eerst elk item van de $row array over moeten zetten naar een gewone string...
Deze in mail() gesmeten en het werkt.

Thnx voor de hulp jongens!

[ Voor 31% gewijzigd door CH4OS op 28-03-2007 21:43 ]


Acties:
  • 0 Henk 'm!

  • bartbh
  • Registratie: Maart 2004
  • Niet online
Kleine opmerking:
Je doet
PHP:
1
2
3
4
5
6
7
8
    if($num_rows == 1) 
    { 
        while($row = mysql_fetch_assoc($result)) 
        {                 
            $mailer = $row;                     
        } 

    }
Als je weet dat je maar 1 resultaat wil/gaat krijgen hoef je geen while meer te doen maar kun je direct het resultaat in een array slingeren:
PHP:
1
2
3
4
    if($num_rows == 1) 
    { 
        $mailer= mysql_fetch_assoc($result)
    }

Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Topicstarter
bartbh schreef op woensdag 28 maart 2007 @ 23:26:
Kleine opmerking:
Je doet
PHP:
1
2
3
4
5
6
7
8
    if($num_rows == 1) 
    { 
        while($row = mysql_fetch_assoc($result)) 
        {                 
            $mailer = $row;                     
        } 

    }
Als je weet dat je maar 1 resultaat wil/gaat krijgen hoef je geen while meer te doen maar kun je direct het resultaat in een array slingeren:
PHP:
1
2
3
4
    if($num_rows == 1) 
    { 
        $mailer= mysql_fetch_assoc($result)
    }
Ah oke, thnx voor de tip, kan ik dat voor een volgende keer (ook) doen!
De reden dat ik een while loop deed, is omdat ik dacht dat de velden die terug komen uit de query per keer afgevangen worden en daardoor je array stukje bij beetje uitbreid... ;) Vandaar dat ik de while-loop deed...

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 08:06

crisp

Devver

Pixelated

of nog korter:
PHP:
1
2
3
4
5
6
7
8
if(!$result)
{
    echo 'Kon query niet uitvoeren: '. mysql_error();
}
elseif ($mailer = mysql_fetch_assoc($result))
{
    // etcetera
}

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Topicstarter
crisp schreef op donderdag 29 maart 2007 @ 00:30:
of nog korter:
PHP:
1
2
3
4
5
6
7
8
if(!$result)
{
    echo 'Kon query niet uitvoeren: '. mysql_error();
}
elseif ($mailer = mysql_fetch_assoc($result))
{
    // etcetera
}
Dat gaat in dit geval niet, want de query kan wel goed zijn, maar geen resultaten weergeven.
Als een mailtje verzonden is, word het record verwijderd uit de database.
Mocht ik meerdere rijen terugkrijgen (die kans is uiterst klein, maar enigsinds wel mogelijk) dan oet ik ook een foutmelding teruggeven, dat er meerdere rijen gevonden waren. ;)

Acties:
  • 0 Henk 'm!

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Return-Path kun je ook rustig weg laten, die wordt pas bij de final delivery in een inbox toegevoegd door de MTA, en dan rustig overschreven. In de tussentijd kan 't al bestaan van een foutieve header alleen maar problemen veroorzaken.

All my posts are provided as-is. They come with NO WARRANTY at all.


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 08:06

crisp

Devver

Pixelated

GJ-tje schreef op donderdag 29 maart 2007 @ 12:42:
[...]
Dat gaat in dit geval niet, want de query kan wel goed zijn, maar geen resultaten weergeven.
Dan geeft mysql_fetch_assoc gewoon FALSE terug.
Mocht ik meerdere rijen terugkrijgen (die kans is uiterst klein, maar enigsinds wel mogelijk) dan oet ik ook een foutmelding teruggeven, dat er meerdere rijen gevonden waren. ;)
Je geeft nu ook geen foutmelding, en als dat een fout-situatie is moet je ervoor zorgen dat er ueberhaupt geen meerdere records met dezelfde code in je tabel kunnen staan...

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Topicstarter
crisp schreef op donderdag 29 maart 2007 @ 12:48:
Dan geeft mysql_fetch_assoc gewoon FALSE terug.
En weer een leermoment, ook dit wist ik dus niet.
Je geeft nu ook geen foutmelding, en als dat een fout-situatie is moet je ervoor zorgen dat er ueberhaupt geen meerdere records met dezelfde code in je tabel kunnen staan...
Ik heb de code die verstuurd word en waaruit bepaald word welk bericht er verstuurd moet worden, geminimaliseerd, door een md5-hash te trekken over emailadres en de unixtimestamp.
Dus op zich is de kans heel erg minimaal dat er een zelfde md5-code gegenereerd word, maar je weet maar nooit en dat moet ook wel afgevangen worden lijkt me.
CyBeR schreef op donderdag 29 maart 2007 @ 12:47:
Return-Path kun je ook rustig weg laten, die wordt pas bij de final delivery in een inbox toegevoegd door de MTA, en dan rustig overschreven. In de tussentijd kan 't al bestaan van een foutieve header alleen maar problemen veroorzaken.
Dankjewel voor de tip, deze haal ik er dan vanavond meteen uit!

[ Voor 21% gewijzigd door CH4OS op 29-03-2007 13:47 ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 08:06

crisp

Devver

Pixelated

GJ-tje schreef op donderdag 29 maart 2007 @ 13:44:
Ik heb de code die verstuurd word en waaruit bepaald word welk bericht er verstuurd moet worden, geminimaliseerd, door een md5-hash te trekken over emailadres en de unixtimestamp.
Dus op zich is de kans heel erg minimaal dat er een zelfde md5-code gegenereerd word, maar je weet maar nooit en dat moet ook wel afgevangen worden lijkt me.
Ja, maar dat moet je dus afvangen voordat je het in de tabel stopt. Als een code blijkbaar al bestaat voor een bepaald bericht dan zal je gewoon een nieuwe code moeten aanmaken die nog niet bestaat.

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Topicstarter
crisp schreef op donderdag 29 maart 2007 @ 14:41:
Ja, maar dat moet je dus afvangen voordat je het in de tabel stopt. Als een code blijkbaar al bestaat voor een bepaald bericht dan zal je gewoon een nieuwe code moeten aanmaken die nog niet bestaat.
Dan zou ik dus op het code-veld in de tabel een unique-key moeten hangen, zodat ik er zeker van ben dat ie altijd uniek is. Maar hoe vang ik dit dan af met PHP, zodat deze een nieuwe code kan berekenen?

Acties:
  • 0 Henk 'm!

  • Deviruchi
  • Registratie: December 2006
  • Laatst online: 20-09 21:58
Kun je in je tabel niet een ID meegeven, die primary key geven, zodat die altijd unique is, en auto_increment. Vervolgens maak je de code door md5 ( $timestamp . $id ); te doen, zo is het een stuk minder waarschijnlijk dat je dezelfde codes krijgt. Om te checken of die al bestaat, doe je gewoon een simpele select op je code, en als je hier geen resultaat voor terugkrijgt, is de code dus uniek, en kun je die gebruiken, en anders maak je de code opnieuw aangezien er inmiddels wel weer een ms voorbij is gegaan, en de code dus weer uniek is.

Eventueel doe je zelfs nog een usleep(rand(0,10)); voordat je de 2e keer de code aanmaakt.

[ Voor 7% gewijzigd door Deviruchi op 29-03-2007 15:14 ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Laatst online: 08:06

crisp

Devver

Pixelated

GJ-tje schreef op donderdag 29 maart 2007 @ 14:52:
[...]
Dan zou ik dus op het code-veld in de tabel een unique-key moeten hangen, zodat ik er zeker van ben dat ie altijd uniek is. Maar hoe vang ik dit dan af met PHP, zodat deze een nieuwe code kan berekenen?
PHP:
1
2
3
4
5
$result = mysql_query("INSERT INTO ....");
if (!$result && mysql_errno() == 1062)
{
  // duplicate key-error
}

;)

Intentionally left blank

Pagina: 1