[PHP/MySql] Gedeeltes uit een tekst vervangen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • judgem
  • Registratie: December 2001
  • Laatst online: 28-04-2014

judgem

Lord of Metal

Topicstarter
Dag lui,

Aangezien ik een site (een maandelijks e-zine - zie undersign) wat aan het reorganiseren ben met het oog op een complete verhuizing naar een nieuwe server (de database en een fors deel van plaatjes staan er al), ben ik begonnen met de boel flink op te schonen. Voorheen stonden de plaatjes op diverse locaties op het net verspreid vanwege capaciteitsproblemen met bandbreedte en serverruimte. Met de nieuwe server zijn die problemen verleden tijd maar het heeft wel zijn sporen nagelaten en het puin ruimen kan nu beginnen.

De situatie was als volgt: In mijn database heb ik een tabel met bijvoorbeeld de interviews erin. Om die interviews wat op te leuken hebben we er ook wat plaatjes ingestopt. Voorheen gebeurde dat middels een mengeling van UBB-code en HTML bijvoorbeeld zo:

code:
1
<center>[img]http://www.andereloactie.nl/hoofddir/plaatjesdir/interviews/plaatje.jpg[/img]</center>


Sinds enige maanden heb ik een nieuwe tag in het leven geroepen en het enige wat nu nog nodig is om een plaatje gecentreerd in te voeren is dit:

code:
1
[pic]plaatje.jpg[/pic]


Dat werkt perfect. Middels een PHP script wordt automatisch de juiste directory waar het plaatje zich op de nieuwe server bevindt bepaald en het plaatje wordt prima weergegeven.

Nu zijn er nog een stuk of 70 interviews waarbij de verwijzingen nog steeds naar de oude locatie gaan. Ik dacht slim te zijn door een rewritefunctie te maken zoals hieronder:

PHP:
1
2
3
4
5
6
function replacepic($string)
{
    $string = str_replace("<center>[img]http://www.andereloactie.nl/hoofddir/plaatjesdir/interviews/","[pic]",$string);
    $string = str_replace("[/img]</center>","[/pic]",$string);
    return $string;
}


en deze in een loop in 1 keer te vervangen middels:

PHP:
1
2
3
4
5
while(loop)
{
    $id = $interviews["auto_id"];
    mysql_query("UPDATE interviews set interviewtext = '".replacepic($interviews["interviewtext"])."' WHERE auto_id = ".$id);
}


Uiteraard wel even op een testomgeving (mijn oude database) om zo geen schade toe te brengen ;)

Nu krijg ik als ik de replacepic-functie laat printen wel het goede resultaat maar de updatequery wordt dan weer niet uitgevoerd. :( Ik snap niet hoe dat kan. Mogelijke oorzaken die ik me zat te bedenken zijn:

1. Mijn oude database is MySql versie 3.23.49 en kan dit niet aan (de nieuwe is overigens 4.1)
2. Er staan in de interviewtekst een aantal single quotes die de query onderbreken

Optie 1 kan ik moeilijk nagaan aangezien ik mijn nieuwe database niet als proefkonijn wil gebruiken
Optie 2 kan ik wellicht tegengaan door het gebruik van addslashes maar die zal er ik er daarna toch weer uit moeten vissen want die wil ik niet in mijn database hebben (ook nooit gehad). stripslashes(replacepic(addslashes($interviews["interviewtext"]))) zal in zo'n geval weinig uithalen vrees ik.

Ik hoop dat er hier iemand is die wellicht een idee heeft over hoe ik dit het beste kan aanpakken. Alle input wordt zeer gewaardeerd en mijn dank ik bij voorbaat al van Bijbelse proporties. :)

- Ik bespreek ook harde waren en dan wel op www.lordsofmetal.nl - en ik draai en programmeer ze in DYNAMO


Acties:
  • 0 Henk 'm!

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 20:53
Waarom haal je eerst de hele inhoud van het veld naar PHP, Replace je daar en doe je daarna een update? Kent MySQL geen "Replace"?
MSSQL:
SQL:
1
2
3
4
UPDATE
    Test
SET
    veld = REPLACE( veld, '<center>[img]http://www.andereloactie.nl/hoofddir/plaatjesdir/interviews/', '' );

Roomba E5 te koop


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
je moet mysql_real_escape_string (of mysql_escape_string voor oudere versies) gebruiken om je tekst te escapen. Bovendien is het handig om mysql_query($query) or die(mysql_error()); te gebruiken om zo te zien wat er fout gaat.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • judgem
  • Registratie: December 2001
  • Laatst online: 28-04-2014

judgem

Lord of Metal

Topicstarter
Michali schreef op dinsdag 03 mei 2005 @ 11:35:
Bovendien is het handig om mysql_query($query) or die(mysql_error()); te gebruiken om zo te zien wat er fout gaat.
Hmmz. De error-melding heeft het er inderdaad over dat hij flipt op single quotes. :(
je moet mysql_real_escape_string (of mysql_escape_string voor oudere versies) gebruiken om je tekst te escapen.
Deze optie ga ik zodadelijk eens proberen. Het zijn dus toch die single quotes.

[ Voor 1% gewijzigd door judgem op 03-05-2005 11:52 . Reden: typo ]

- Ik bespreek ook harde waren en dan wel op www.lordsofmetal.nl - en ik draai en programmeer ze in DYNAMO


Acties:
  • 0 Henk 'm!

  • judgem
  • Registratie: December 2001
  • Laatst online: 28-04-2014

judgem

Lord of Metal

Topicstarter
Probleem lijkt opgelost te zijn. Zoals ik al eeder zei: Mijn dank is van bijbelse proporties _/-\o_

- Ik bespreek ook harde waren en dan wel op www.lordsofmetal.nl - en ik draai en programmeer ze in DYNAMO


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

En hoe heb je het nou opgelost? :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • judgem
  • Registratie: December 2001
  • Laatst online: 28-04-2014

judgem

Lord of Metal

Topicstarter
-NMe- schreef op dinsdag 03 mei 2005 @ 13:36:
En hoe heb je het nou opgelost? :)
Leuk om weer eens mijn oude topics door te spitten :+

Maar goed, here goes. Bij deze mijn rewritescript (al zitten er wat pre-fab sql-klasses en methodes in maar ik denk dat de strekking wel duidelijk is :)):

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
26
27
28
29
30
31
32
33
$conn = new connection();

function replacepic($string)
{
    $string=str_replace(trim("<center>[img]http://home.concepts.nl/~wbn0132/lompics/interviews/25"),"[pic]",$string);
    $string=str_replace("[/img]</center>","[/pic]",$string);
    return $string;
}

$sql[1] = "SELECT auto_id, interview_nl, interview_en, voorwoord_nl, voorwoord_en FROM interviews WHERE issuenr < 26 AND issuenr > 18";
$sql[2] = "SELECT auto_id, verhaal_nl, verhaal_en, voorwoord_nl, voorwoord_en FROM specials WHERE issuenr < 26 AND issuenr > 18";
$sql[3] = "SELECT auto_id, review_nl, review_en, voorwoord_nl, voorwoord_en FROM live_reviews WHERE issuenr < 26 AND issuenr > 18";

$conn->open_query("int",$sql[1]);
while($int = $conn->get_record("int"))
{
    $id = $int["auto_id"];
    $int_nl = replacepic($int["interview_nl"]);
    $int_en = replacepic($int["interview_en"]);
    $vw_nl = replacepic($int["voorwoord_nl"]);
    $vw_en = replacepic($int["voorwoord_en"]);
    $q[1] = "UPDATE interviews SET interview_nl = '".$int_nl."' WHERE auto_id = ".$id;
    $q[2] = "UPDATE interviews SET interview_en = '".$int_en."' WHERE auto_id = ".$id;
    $q[3] = "UPDATE interviews SET voorwoord_nl = '".$vw_nl."' WHERE auto_id = ".$id;
    $q[4] = "UPDATE interviews SET voorwoord_en = '".$vw_en."' WHERE auto_id = ".$id;
    mysql_query($q[1]);
    mysql_query($q[2]);
    mysql_query($q[3]);
    mysql_query($q[4]);
    print replacepic($int["interview_en"]);
}
$conn->close_query("int");
$conn->dispose_connection();

en dan de regel print replacepic($int["interview_en"]); steeds vervangen voor het betreffende veld. Wellicht niet helemaal optimaal gedaan (ik denk zelfs dat ik het tegenwoordig iets anders zou aanpakken) maar desalniettemin heeft het goed geholpen en me een boel handmatig klopwerk bespaard :)

- Ik bespreek ook harde waren en dan wel op www.lordsofmetal.nl - en ik draai en programmeer ze in DYNAMO

Pagina: 1