Hallo,

ik ben relatief nieuw in het wereldje van MySql en php...(heb wel ervaring met Oracle, Caché en .NET)

ik heb net mijn forum aangepast met een paar MODs en daarna de data van mijn origineel forum daar naar overgezet...
nu zit ik met een klein probleempje in mijn phpbb_topics tabel.

om dit op te lossen heb ik een scriptje nodig dat voor elke topic in mijn phpbb_posts tabel een dummy record toevoegt en dat daarna dan ook weer verwijdert. (does this make a lot of sense?) :p

enige hulp would be appreciated :)
scriptjes zouden er ongeveer zo moeten uitzien:

script 1:

SELECT distinct topic_id from phpbb_posts;

foreach topic_id loop
INSERT INTO phpbb_posts (..., ...
Values (..., topic_id

end foreach


script 2:

SELECT max(post_id), topic_id from phpbb_posts group by topic_id;

foreach topic_id loop
delete from phpbb_posts
where topic_id = topic_id and post_id (select MAX(post_id) from phpbb_posts where topic_id = topic_id)

end foreach


(in mijn delete statement vrees ik wel een beetje voor mutating tables tenzij ik die subselect kan vervangen door iets anders?) :)
mja, ik heb al hulp gevraagd op phpbb.com maar daar willen ze me ook niet helpen...

pfff...

had ik nu willekeurige tabellen gebruikt ipv phpbb_posts e.d., hadden jullie dan geholpen?
Jip is een persoon, niet het hele forum gelukkig :)

Heb je al enige kennis met PHP en MySQL? Hier is iig de meest standaard inleiding in het geval datg je nee op mijn vraag zou antwooorden.

Script 1 is nog vrij simpel. Ik ga er evenvanuiit dat je mysql_connect e.d. zelf erbij invoegt.

<?php

$sql_result = mysql_query("SELECT DISTINCT topic_id FROM phpbb_posts");

if($sql_result) // $sql_result is 'false' waneer er een fout in de query zat, en in dat geval hoeven we niet verder.
{
while($row = mysql_fetch_assoc($sql_result)) //voor iedere regel uit het resultaat
{
if(mysql_query("INSERT INTO phpbb_posts SET topic_id=".$row['topic_id'].", post_name='enz'..."))
{
echo 'Rij '.$row['topic_id'].' succesvol toegevoegd<br>';
}
}
}
else
{
echo mysql_error();
}
?>
dank u voor het antwoord, dit helpt me al een beetje op weg :)

en hoe kan ik die net toegevoegde records (en enkel die) dan ook weer deleten?
(zou het voldoende zijn in phpMyAdmin een
"delete from phpbb_posts where creatiedatum (of iets dergelijks?) > dan uurtje geleden of zo?
Ik vind dat als je een systeem download, dat er dan op het forum van de makers gewoon antwoord gegeven moet worden. Ik wil je best helpen hoor, daar niet van, maar naar mijn mening zullen de makers (en de 'experts' die zich er heel erg in verdiept hebben) je gewoon simpelweg veel beter helpen...
Weet je wanneer ze precies gemaakt zijn, die dummy-records?
hey Jip, geen probleem hoor, ik versta je punt.

maar jullie zijn al het derde forum waar ik hulp probeer te zoeken en het eerste waar ik een antwoord krijg ook.

Op zich zijn de scriptjes niet zo moeilijk denk ik (althans de logica niet), maar ik ben nog niet helemaal thuis in de syntax van php, vandaar :)

en ja, eigelijk is het de bedoeling die records aan te maken en ze direct te verwijderen...

lijkt inderdaad een nutteloos script, maar ik heb het nodig om bepaalde zaken terug in orde te brengen in mijn tables :)
Ik denkd at je better tijdens script 1 al alle insert_id()'s kan opslaan in een array en deze dan weer via een for-lusje verwijderen. (de array kan je tijdelijk opslaan door hem met file_put_contents() en serialize() in een bestand te stoppen, en dan in script 2 weer uit te lezen via file_get_contents() en unzerialize().)

Dus bij script 1, onder de insert-query , in de loop, en dus net boven de echo zou je nog kunnen zetten <? $inserted[] = mysql_insert_id(); ?>. Bovenaan je script moet dan nog even <? $inserted = array(); ?> (even vars definieren tegen errors) en aan het einde zou je nog <? file_put_contents('inserted.txt', serialize($inserted)); ?> kunnen zetten.
Script 2 wordt dan iets in deze richting vermoed ik:

<?php
//verbindingen e.d. hier ook weer in.
$inserted = unserialize(file_get_contents('inserted.txt'));

for($i = 0; $i < count($inserted); $i++)
{
if(mysql_query("DELETE FROM phpbb_posts WHERE post_id=".$inserted[$i]." LIMIT 1"))
{
echo 'Post #'.$inserted[$i].' verwijderd<br>';
}
}
?>

edit: Oja, file_put_contents in script1 is pas beschikbaar vanaf PHP versie 5. Mocht je dus een 'undefined function' error krijgen, dan moet je deze 2 funties even in je script plakken, bij voorkeur helemaal bovenaan:
<?php
if(!function_exists('file_put_contents'))
{
function file_put_contents($filename, $data, $file_append = false)
{
$fp = fopen($filename, (!$file_append ? 'w+' : 'a+'));
if(!$fp)
{
trigger_error('file_put_contents cannot write in file.', E_USER_ERROR);
return;
}
fputs($fp, $data);
fclose($fp);
}
}

if (!function_exists('file_get_contents')) {
function file_get_contents($filename, $incpath = false, $resource_context = null)
{
if (false === $fh = fopen($filename, 'rb', $incpath)) {
user_error('file_get_contents() failed to open stream: No such file or directory',
E_USER_WARNING);
return false;
}

clearstatcache();
if ($fsize = @filesize($filename)) {
$data = fread($fh, $fsize);
} else {
$data = '';
while (!feof($fh)) {
$data .= fread($fh, 8192);
}
}

fclose($fh);
return $data;
}
}
?>
Hoe ziet de tabel phpbb_posts eruit; wat zijn de velden?

@Jelmer: Is het wel nodig om met serialize en unserialize te werken? Je kunt toch ook gewoon de array opslaan door alle id's te scheiden door een '|' en dan bij het verwijderen met explode te werken? Of zelfs nog makkelijker; de records meteen na de aanmaak te verwijderen, ik weet alleen niet of dat het probleem verhelpt...

Reageren