webForumDet fria alternativet

Php eller MySQL buffrar...

8 svar · 772 visningar · startad av drew

drewMedlem sedan mars 2007845 inlägg
#1

Jag har ett skript som ser ut ungefär som exemplet nedan. Jag har tagit bort en del onödiga grejer.

I varje loop i while-satsen ändras datan i $sql och ska skrivas in i en tabell. Jag har med echo kollat att innehållet i $sql verkligen ändras. Ändå skrivs samma sak ner varje gång. Det verkar som antingen php eller MySQL sparar det i någon buffert och tar queryn därifrån istället för strängen som jag försöker skicka med.
Det måste väl gå att rensa den bufferten på något sätt? Eller att tvinga den till att använda strängen jag skickar med istället för det den buffrat?

Jag har försökt med mysql_unbuffered_query() och 'RESET QUERY CACHE' till ingen nytta.

Någon som har något förslag?

<?php
$sql = 'SELECT *
	FROM users_table';
$result = mysql_query($sql);
while($row = mysql_fetch_array($result, MYSQL_ASSOC))
{
/* Klipp */

	$to_id = $row['user_id'];
	$sql = 'INSERT INTO ' . PRIVMSGS_TABLE . " (author_id, author_ip, message_time, message_subject, message_text, bbcode_bitfield, bbcode_uid, to_address, bcc_address)
		VALUES ($from_id, '$avs_ip', $nu, '$pm_sub', '$pm_text', '$pm_bbkod_bits', '$pm_bbkod_id', 'u_{$to_id}', '')";
	mysql_query($sql);
}

?>

/J

aasahMedlem sedan mars 20034 471 inlägg
#2

drew skrev:

I varje loop i while-satsen ändras datan i $sql och ska skrivas in i en tabell. Jag har med echo kollat att innehållet i $sql verkligen ändras. Ändå skrivs samma sak ner varje gång. ...

Någon som har något förslag?

Hm... Testa att byta till nya variabelnamn inne i while, jämfört med första sql-satsen. Alltså:

<?php
$sql = 'SELECT * FROM users_table';  //$sql
$result = mysql_query($sql);  //$result
while($row = mysql_fetch_array($result, MYSQL_ASSOC)) //$row
{
/* Klipp */

	$to_id = $row['user_id'];
	//Här använder vi $insSQL istället
	$insSQL = 'INSERT INTO ' . PRIVMSGS_TABLE . " (author_id, author_ip, message_time, message_subject, message_text, bbcode_bitfield, bbcode_uid, to_address, bcc_address)
		VALUES ($from_id, '$avs_ip', $nu, '$pm_sub', '$pm_text', '$pm_bbkod_bits', '$pm_bbkod_id', 'u_{$to_id}', '')";
	mysql_query($insSQL);
}

?>

Jag fick ett liknande fel tidigare idag när jag råkade återanvända samma namn utanför och innanför while...

LarsGMedlem sedan dec. 200012 464 inlägg
#3

Det behövs ingen php-loop, du kan göra det direkt i SQL med

insert into t(<columns>) select ...
drewMedlem sedan mars 2007845 inlägg
#4

Jag testade att byta variabelnamnet. Ingen skillnad. Jag har också tidigare provat unset($sql); utan att det hjälpte.

php-loopen behövs för att bl a $pm_sub och $pm_text innehåller olika text beroende på inställningarna som hämtas med den första queryn.

HiDensityMedlem sedan dec. 20051 420 inlägg
#5

Jag skulle råda dig till att skapa en enkel db.php som du inkluderar där du behöver databasen. Innehållande två funktioner, en för Query och en för Insert. Som båda öppnar en koppling till databasen och sen stänger den när de är klara. Då borde du slippa problem med buffrar som hänger kvar. (Och det är smidigare att programmera fler grejor sen.)

<?php
function Insert($sql)
{
	$db = mysql_connect("adress.till.databasen.com", "username", "pass") or die("Databasfel.");
	mysql_select_db("databasens_namn", $db);
	mysql_query($sql);
	mysql_close($db);
}
function Query($sql)
{
	$db = mysql_connect("adress.till.databasen.com", "username", "pass") or die("Databasfel.");
	mysql_select_db("databasens_namn", $db);
	$result = mysql_query($sql) or die("SQL-satsen gav inget resultat.");
	mysql_close($db);
	return $result;
}?>
aasahMedlem sedan mars 20034 471 inlägg
#6

Jag har aldrig varit med om att samma sida skulle behöva två eller flera connections. Det blir ju rejält overhead att öppna och stänga dem hela tiden. Betänk att hans insert ligger i en whileslinga! Nog måste det gå att hitta en vettigare lösning... ? :q

drewMedlem sedan mars 2007845 inlägg
#7

. :r :r
Jag har hittat felet. Det låg inte i skripet jag höll på att göra utan ett annat som förutsatte att samma användare inte skrev mer än ett pm per sekund.

HiDensityMedlem sedan dec. 20051 420 inlägg
#8

aasah skrev:

Det blir ju rejält overhead att öppna och stänga dem hela tiden. Betänk att hans insert ligger i en whileslinga!

Naturligtvis helt sant som du säger. Så går det när man snabbläser kod =)

LarsGMedlem sedan dec. 200012 464 inlägg
#9

php-loopen behövs för att bl a $pm_sub och $pm_text innehåller olika text beroende på inställningarna som hämtas med den första queryn.

Så du har alltså php-kod som ser ut som

if  ($row['someColumn'] == 'someValue')
{
    $pm_sub = 'tjo';
}
else
{
    $pm_sub = 'flöjt';
}

?

Du kan lägga in sådana översättningar direkt i select med hjälp av case.

137 ms totalt · 3 externa anrop · v20260731065814-full.3ab8d573
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)