Wpis z mikrobloga

#pytaniedoeksperta #php #mysql #trudnesprawy

Mam kłopot z kodem :-/ i proszę o pomoc :-)

`php<br/
$wklej[1] = 'Zammiennik pierwszy';

$wklej[2] = 'Zammiennik drugi';

$wklej[3] = 'Zammiennik trzeci';

$string = 'Lorem ipsum dolor sit amet, [wklej=1] consetetur sadipscing elitr, sed diam nonumy eirmod [wklej=2] tempor invidunt ut labore et dolore [wklej=3] magna aliquyam erat, sed diam voluptua.';

$tablica = preg_match_all("#[wklej=\d\]#si", $string, $matches);

for($i=0; $i
{

$string = str_replace($matches[0][$i], $wklej[$i], $string);

}

echo $string;

?>`

Jak widzicie w kodzie na samym początku definiuje wartości jakie mają być pokazane zamiast [wklej=ID] problem jest taki ,że ja nie wiem czy ktoś wstawi ID=1,5 czy 250 więc bez sensu pobierać całą zawartość bazy. Wsadzanie zapytania do pętli też za bardzo zawali bazę. Więc nie wiem jak na początku pobrać z bazy tylko te Rekordy które są użyte w tekście czyli przykładowo mam bazę:

ID | Nazwa

1 | Tekst1

2 | Tekst 2

3 | Tekst 3

4 | Tekst 4

I teraz ktoś w tekście pisze: xxxxx [wklej=4] xxxxxxxxxx [wklej=2] xxxxxxxxxx Więc to jest zamieniane zgodnie z danymi z bazy na: xxxxx Tekst 4 xxxxxxxxxx Tekst 2 xxxxxxxxxx

I tego nie wiem jak rozwiązać :-/
  • 12
@StaryHipopotam:

$wklej[1] = 'Zammiennik pierwszy';

$wklej[2] = 'Zammiennik drugi';

$wklej[3] = 'Zammiennik trzeci';

Ten fragment jest dla ułatwienia i sprawdzenia czy kod działa. Ciekawe rozwiązanie co prezentujesz, tylko jak zrobić końcówkę czyli replace z wynikami ? Tak tak tekst jest stały z bazy i podczas wyświetlania go chcę go zmienić.
@StaryHipopotam:

Zgubiłem się :-/

php<br/
include_once("../db.inc.php");

echo'Test
====

';

$txt = 'Lorem ipsum dolor sit amet, [foto id="97" size="small"] consetetur sadipscing elitr, sed diam nonumy eirmod tempor [foto id="143" size="big"] invidunt ut labore et dolore magna [foto id="139" size="big"] aliquyam erat, sed diam voluptua.';

echo $txt.'
----
';

$tablica = preg_match_all('#[foto id="(.?)" size="(.?)"]#si', $txt, $matches);

echo '
```';echo print_r($matches[1]);echo '```
';

$res = @mysql_query('SELECT id, img FROM foto WHERE id
@oomaster:

mysql_fetch_assoc
zwraca Ci jeden row, a nie tablicę wszystkich, więc powinieneś przenieść go do pętli. Poza tym - rozumiem, że używasz matches jako primary key tabeli. Zapytanie Ci się pieprzy - stringi muszą być w uszach (' ') i w nawiasie.
@StaryHipopotam: Baza nie zwraca żadnego rekordu:

$res = @mysql_query('SELECT id, img FROM foto WHERE id IN '.$matches[1]);

$row = @mysql_fetch_array($res);

echo print_r($row);

Bo wyskakuje błąd: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Array' at line 11 Czyli nie mogę sobie ot tak wrzucić $matches[1] do zapytania, to jak to zrobić ?
@oomaster: nooo, to zapytanie działałoby, gdybyś miał wynik jak w przykładzie, czyli id-ki w intach. Ale masz stringi. Poza tym, nie wstawiłeś nawiasu w zapytaniu.

Musisz przekształcić tę tablicę $matches[1] w string, dodając do każdego apostrof na początku i na końcu i robiąc implode przecinkiem, a całość musi być w nawiasie.
@StaryHipopotam: `$array = $matches[1];

$commaseparated = implode(",", $array);

echo $comma
separated;

$res = @mysql_query('SELECT id, img FROM foto WHERE id IN ('.$comma_separated.')');

$row = @mysql_fetch_array($res);

echo mysql_error();

echo '

';

echo printr($row);

echo '

';`
$comma
separated ma wartość : '97', '143', '139'

O dziwo w wyniku daje :

Array

(

[0] => 97

[id] => 97

[1] => 46199669851267a5d2b63.jpg

[img] => 46199669851267a5d2b63.jpg

)

1
Rozwiązanie dla ciekawych:

$txt = 'Lorem ipsum dolor sit amet, [foto id="97" size="small"] consetetur sadipscing elitr, sed diam nonumy eirmod tempor [foto id="143" size="big"] invidunt ut labore et dolore magna [foto id="139" size="big"] aliquyam erat, sed diam voluptua.';

$tablica = preg_match_all('#[foto id="(.*?)" size="(.*?)"\]#si', $txt, $matches);

$comma_separated = implode(",", $matches[1]);

$res = @mysql_query('SELECT id, img FROM foto WHERE id IN ('.$comma_separated.') ORDER BY FIELD(

id

, '.$comma_separated.') ASC;');

$i=0;

while( $row =