[php/cookies/mysql] Något går för långsamt

Permalänk
Medlem

[php/cookies/mysql] Något går för långsamt

Jag har lite problem med denna koden.
Den fungerar, men gör ny kaka några gånger innan det blir rätt.

Målet är att varje ny besökare skall få två rader i databasen med några ettor och tvåor. (detta är ju såklart inte målet för det helt färdiga, men det spelar ingen roll nu)

Sedan skall besökaren få fram det som gjordes vid förra besöket.

Problemet nu är att det skapas massa rader i databasen utan $setcooolCookieId men efter några uppdateringar av sidan blir allt rätt. Precis nedanför detta laddas och visas besökarens två rader. (Detta fungerar också efter en stund / uppdateringar.

Vad har jag gjort fel?

<?php /* Kollar om besökaren redan har en kaka. */ if ($_COOKIE["cooolCookieId"] == "") { function createcooolCode($length) { $chars = "234BCD"; $i = 0; $cooolCode = ""; while ($i <= $length) { $cooolCode .= $chars{mt_rand(0,strlen($chars))}; $i++; } return $cooolCode; } $cooolCode = createcooolCode(12); $cooolcookiecon = mysql_connect("host","user","pass"); if (!$cooolcookiecon) { die('Could not connect: ' . mysql_error()); } mysql_select_db("databasen", $cooolcookiecon); $sql="INSERT INTO coool_id (id, cooolcode) VALUES (NULL,'$cooolCode')"; if (!mysql_query($sql,$cooolcookiecon)) { die('Error: ' . mysql_error()); } $result = mysql_query("SELECT * FROM coool_id WHERE cooolcode ='$cooolCode'"); while($row = mysql_fetch_array($result)) { $setcooolCookieId = $row['id']; $setcooolCookieCode = $row['cooolcode']; } setcookie("cooolCookieId", $setcooolCookieId, time()+3600); /* 1 tim */ setcookie("cooolCookieCode", $setcooolCookieCode, time()+3600); /* 1 tim */ /* FIXA IN GRUNDVARDEN */ $sql1="INSERT INTO records (recordID, awsUserId, awsUserIdIn, recordText, recordListingID) VALUES (NULL, '$setcooolCookieId', '', '1111', '1')"; if (!mysql_query($sql1,$cooolcookiecon)) { die('Error: ' . mysql_error()); } $sql2="INSERT INTO records (recordID, awsUserId, awsUserIdIn, recordText, recordListingID) VALUES (NULL, '$setcooolCookieId', '', '2222', '2')"; if (!mysql_query($sql2,$cooolcookiecon)) /* Raden under saknades i min första post, därav svaren nedan */ { die('Error: ' . mysql_error()); } echo "<i>Bakat ny kaka - mmm</i>"; } else { echo "<i>Tagit fram gammal kaka - fortfarande saftig</i>"; } ?>

Visa signatur

Detta är min tjusiga signatur. <<<<<<<

Permalänk
Medlem

Den säger bara att den har bakat en ny kaka om andra INSERTen misslyckas enligt din kod

$sql2="INSERT INTO records (recordID, awsUserId, awsUserIdIn, recordText, recordListingID) VALUES (NULL, '$setcooolCookieId', '', '2222', '2')"; if (!mysql_query($sql2,$cooolcookiecon)) echo "<i>Bakat ny kaka - mmm</i>";

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Den säger bara att den har bakat en ny kaka om andra INSERTen misslyckas enligt din kod

$sql2="INSERT INTO records (recordID, awsUserId, awsUserIdIn, recordText, recordListingID) VALUES (NULL, '$setcooolCookieId', '', '2222', '2')"; if (!mysql_query($sql2,$cooolcookiecon)) echo "<i>Bakat ny kaka - mmm</i>";

Hmm, är du säker på det?
Den ELSE:en är för: if ($_COOKIE["cooolCookieId"] == "") .

Den echon ligger bara där för att jag skall se vilken kodsnutt som laddades. (och det verkar stämma, den lägger in rätt antal rader i databasen och visar att en ny kaka har gjorts)

Visa signatur

Detta är min tjusiga signatur. <<<<<<<

Permalänk
Medlem

Precis som Teknocide skriver, så körs bara echo "<i>Bakat ny kaka - mmm</i>" om INSERTen misslyckas. Blir kanske tydligare om man indenterar koden ordentligt:

$sql2="INSERT INTO records (recordID, awsUserId, awsUserIdIn, recordText, recordListingID) VALUES (NULL, '$setcooolCookieId', '', '2222', '2')"; if (!mysql_query($sql2,$cooolcookiecon)) echo "<i>Bakat ny kaka - mmm</i>";

testa att ändra till följande istället:

$sql2="INSERT INTO records (recordID, awsUserId, awsUserIdIn, recordText, recordListingID) VALUES (NULL, '$setcooolCookieId', '', '2222', '2')"; if (!mysql_query($sql2,$cooolcookiecon)) { die ('Error: ' + mysql_error()); } echo "<i>Bakat ny kaka - mmm</i>";

Visa signatur

as far as we can tell, the massacre went well...

Permalänk
Medlem
Skrivet av jovnas:

Precis som Teknocide skriver, så körs bara echo "<i>Bakat ny kaka - mmm</i>" om INSERTen misslyckas. Blir kanske tydligare om man indenterar koden ordentligt:

$sql2="INSERT INTO records (recordID, awsUserId, awsUserIdIn, recordText, recordListingID) VALUES (NULL, '$setcooolCookieId', '', '2222', '2')"; if (!mysql_query($sql2,$cooolcookiecon)) echo "<i>Bakat ny kaka - mmm</i>";

testa att ändra till följande istället:

$sql2="INSERT INTO records (recordID, awsUserId, awsUserIdIn, recordText, recordListingID) VALUES (NULL, '$setcooolCookieId', '', '2222', '2')"; if (!mysql_query($sql2,$cooolcookiecon)) { die ('Error: ' + mysql_error()); } echo "<i>Bakat ny kaka - mmm</i>";

Oh, sorry my bad. Det är fel i koden ovan. Det är några fler rader liknande de som är ovan men jag tog bort lite där i det dokumentet jag gjorde för att att klistra in här. (tog bort lösen osv)
Så i koden som är felaktig och gör som jag beskriver är det så som du visar. Allt läggs till i databasen som det skall, fast utan värde i userid.

Visa signatur

Detta är min tjusiga signatur. <<<<<<<

Permalänk
Medlem
Skrivet av Andykidden:

Oh, sorry my bad. Det är fel i koden ovan. Det är några fler rader liknande de som är ovan men jag tog bort lite där i det dokumentet jag gjorde för att att klistra in här. (tog bort lösen osv)
Så i koden som är felaktig och gör som jag beskriver är det så som du visar. Allt läggs till i databasen som det skall, fast utan värde i userid.

Hur ser datastrukturen ut för respektive kolumn?
Du matar in allt som strängar/varchars. Kan det vara så att alla IDn är heltal?

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Medlem
Skrivet av Leedow:

Hur ser datastrukturen ut för respektive kolumn?
Du matar in allt som strängar/varchars. Kan det vara så att alla IDn är heltal?

Något likt detta du funderar på?
Alla skall göras nio gånger men det görs många med 0 i awsUserId.

(Där recordID som saknas är alltså sådana som bara blivit nollor, jag bantade ner det lite)

recordID int(11) awsUserId int(11) awsUserIdIn int(10) recordText varchar(255) recordListingID int(11) 64 0 0 1111 1 65 0 0 2222 2 66 0 0 3333 3 55 0 0 1111 1 45 0 0 9999 9 43 0 0 7777 7 42 0 0 6666 6 41 0 0 5555 5 40 0 0 4444 4 39 0 0 3333 3 44 0 0 8888 8 15 75 0 6666 5 11 75 0 2222 1 12 75 0 3333 6 13 75 0 4444 2 14 75 0 5555 4 16 75 0 7777 7 17 75 0 8888 8 18 75 0 9999 9 10 75 0 1111 3 52 79 0 7777 7 46 79 0 1111 1 53 79 0 8888 8 54 79 0 9999 9 51 79 0 6666 6 50 79 0 5555 5 49 79 0 4444 4 48 79 0 3333 3 47 79 0 2222 2 143 89 0 8888 8 142 89 0 7777 7 141 89 0 6666 6 140 89 0 5555 5 139 89 0 4444 4 138 89 0 3333 3 137 89 0 2222 2 136 89 0 1111 1 144 89 0 9999 9

Visa signatur

Detta är min tjusiga signatur. <<<<<<<

Permalänk
Medlem

Det jag tänker på spontant är denna kod:

$result = mysql_query("SELECT * FROM coool_id WHERE cooolcode ='$cooolCode'"); while($row = mysql_fetch_array($result)) { $setcooolCookieId = $row['id']; $setcooolCookieCode = $row['cooolcode']; }

Om din sql fråga hittar flera resultat kommer dina variablar endast innehålla den sista matchningen.
Om du kommenterar ut allt under denna koden ovanför och sen kör en echo på $setcooolCookieId; för att se vad den innehåller vid varje körning.

Permalänk
Medlem
Skrivet av Andykidden:

Något likt detta du funderar på?
Alla skall göras nio gånger men det görs många med 0 i awsUserId.

(Där recordID som saknas är alltså sådana som bara blivit nollor, jag bantade ner det lite)

recordID int(11) awsUserId int(11) awsUserIdIn int(10) recordText varchar(255) recordListingID int(11) 64 0 0 1111 1 65 0 0 2222 2 66 0 0 3333 3 55 0 0 1111 1 45 0 0 9999 9 43 0 0 7777 7 42 0 0 6666 6 41 0 0 5555 5 40 0 0 4444 4 39 0 0 3333 3 44 0 0 8888 8 15 75 0 6666 5 11 75 0 2222 1 12 75 0 3333 6 13 75 0 4444 2 14 75 0 5555 4 16 75 0 7777 7 17 75 0 8888 8 18 75 0 9999 9 10 75 0 1111 3 52 79 0 7777 7 46 79 0 1111 1 53 79 0 8888 8 54 79 0 9999 9 51 79 0 6666 6 50 79 0 5555 5 49 79 0 4444 4 48 79 0 3333 3 47 79 0 2222 2 143 89 0 8888 8 142 89 0 7777 7 141 89 0 6666 6 140 89 0 5555 5 139 89 0 4444 4 138 89 0 3333 3 137 89 0 2222 2 136 89 0 1111 1 144 89 0 9999 9

Jag tycker att denna query:
$sql2="INSERT INTO records (recordID, awsUserId, awsUserIdIn, recordText, recordListingID) VALUES (NULL, '$setcooolCookieId', '', '2222', '2')";

...ska se ut på detta vis

$sql2="INSERT INTO records (recordID, awsUserId, awsUserIdIn, recordText, recordListingID) VALUES (NULL, $setcooolCookieId,, '2222', 2)";

Jag tycker även att det är lite konstigt att det gick att köra queryn.
Men det kanske är tillåtet att skriva så.

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Medlem
Skrivet av hamre:

Det jag tänker på spontant är denna kod:

$result = mysql_query("SELECT * FROM coool_id WHERE cooolcode ='$cooolCode'"); while($row = mysql_fetch_array($result)) { $setcooolCookieId = $row['id']; $setcooolCookieCode = $row['cooolcode']; }

Om din sql fråga hittar flera resultat kommer dina variablar endast innehålla den sista matchningen.
Om du kommenterar ut allt under denna koden ovanför och sen kör en echo på $setcooolCookieId; för att se vad den innehåller vid varje körning.

Japp, skall testa köra den separat (igen) och se om den svarar varje gång.

Skrivet av Leedow:

Jag tycker att denna query:
$sql2="INSERT INTO records (recordID, awsUserId, awsUserIdIn, recordText, recordListingID) VALUES (NULL, '$setcooolCookieId', '', '2222', '2')";

...ska se ut på detta vis

$sql2="INSERT INTO records (recordID, awsUserId, awsUserIdIn, recordText, recordListingID) VALUES (NULL, $setcooolCookieId,, '2222', 2)";

Jag tycker även att det är lite konstigt att det gick att köra queryn.
Men det kanske är tillåtet att skriva så.

Hmm, exakt det du skrev blir väl fel? Du menade att ta bort "awsUserIdIn" också isf?
Jag vet inte varför det inte skulle vara ok att skriva så som jag gjorde? Det är ett fält som skall fyllas i om man är inloggat första gången man tittar på den sidan.

Visa signatur

Detta är min tjusiga signatur. <<<<<<<

Permalänk
Medlem
Skrivet av Andykidden:

Japp, skall testa köra den separat (igen) och se om den svarar varje gång.

Hmm, exakt det du skrev blir väl fel? Du menade att ta bort "awsUserIdIn" också isf?
Jag vet inte varför det inte skulle vara ok att skriva så som jag gjorde? Det är ett fält som skall fyllas i om man är inloggat första gången man tittar på den sidan.

Det jag menar är att strängar ska in som 'sträng' (notera '-tecken) och heltal (integer) ska inte ha detta.
Jag tyckte att det var konstigt om du inte fick något fel när du gjorde så.

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Medlem
Skrivet av Leedow:

Det jag menar är att strängar ska in som 'sträng' (notera '-tecken) och heltal (integer) ska inte ha detta.
Jag tyckte att det var konstigt om du inte fick något fel när du gjorde så.

Jaha, det ligger något i det ja Jag missade att det var det du gjorde med

Visa signatur

Detta är min tjusiga signatur. <<<<<<<