Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Skrypt konwertujący zapytania sql.
Forum PHP.pl > Forum > Przedszkole
assasin
Wita, jeden użytkownik z tego forum napisał mi kawałek skryptu php.
Zadaniem tego skryptu jest konwertowanie zapytania z takiej postaci:


  1. INSERT INTO `quest_template` VALUES ('66634', 'tekst1, 'tekst2', 'tekst3', 'Tekst4.', 'Tekst4?', '0');

na
  1. UPDATE `quest_template` SET 'title'='tekst1, 'Details'= 'tekst2' 'Objectives'='Tekst3' 'OfferRewardText'='Tekst4' 'RequestItemsTex'='Tekst4?' 'EndText'='0' WHERE `id`=66634;


Czyli z dodającego na aktualizujące.
Czy ktoś pomoże ten skrypt skończyć?

  1. $src= 'plik.txt'; //ścieżka do pliku z INSERTami
  2. $inserty=file($src); //każdy INSERT w array
  3. $updates=array();
  4. $i=0;
  5. foreach ($inserty as $insert) {
  6. $insert=str_replace('INSERT INTO `quest_template` VALUES (','',$insert); //utnie początek zapytania
  7. $insert=preg_replace('/;)\z/','',$insert); //utnie koniec zapytania
  8. //$insert zawiera teraz coś na kształt "'66634', 'tekst1', 'tekst2', 'tekst3', 'Tekst4.', 'Tekst4?', '0'"
  9. $wartosci=explode('\', \'',$insert); //np. $wartosci=array('66634', 'tekst1', 'tekst2', 'tekst3', 'Tekst4.', 'Tekst4?', '0'); explode przy użyciu '\', \'' jeśli wiadomo, ze w jakiejś wartości do update'u nie ma takiego tekstu
  10. $updates[$i]='UPDATE `quest_template` SET ';
  11.  
  12. foreach ($wartosci as $i2=>$wartosc) {
  13. if ($i2==1) { //zamiast tego może być switch
  14. $updates[$i].=' `title` = `'.$wartosc.'` ,'; //cudzysłów ` dla pól tekstowych
  15. } elseif ($i2==2) {
  16. ........
  17. } elseif (......) {
  18. ....... //z ostatniej wartości trzeba usunąć cudzysłów prosty z końca: $wartosc=rtrim($wartosc,'\'');
  19. }
  20. }
  21.  
  22. $updates[$i]=rtrim($updates[$i],','); //ucięcie ostatniego przecinka
  23.  
  24. $updates[$i].=' WHERE id = `'.ltrim($wartosci[0],'\'').'`';
  25.  
  26. $i++;
  27. }
  28.  
  29. //$updates zawiera teraz zapytania UPDATE


Pozdrawiam.
athei
Masz dla jednego inserta, dostosuj sobie dla danych, które z pliku pobierasz
  1. $insert = "INSERT INTO `quest_template` VALUES ('66634', 'tekst1', 'tekst2', 'tekst3', 'Tekst4.', 'Tekst4?', '0');";
  2. preg_match('/VALUES \((.*)\);/', $insert, $match);
  3. $wartosci=explode(", ",$match[1]);
  4. $update="
  5. UPDATE `quest_template` SET
  6. title={$wartosci[1]}
  7. , Details= {$wartosci[2]}
  8. , Objectives= {$wartosci[3]}
  9. , OfferRewardText= {$wartosci[4]}
  10. , RequestItemsTex= {$wartosci[5]}
  11. , EndText= {$wartosci[6]}
  12. WHERE `id`= {$wartosci[0]};";
  13.  
  14. echo $update;
  15. //UPDATE `quest_template` SET title='tekst1' , Details= 'tekst2' , Objectives= 'tekst3' , OfferRewardText= 'Tekst4.' , RequestItemsTex= 'Tekst4?' , EndText= '0' WHERE `id`= '66634';
assasin
Ja te zapytania mam w takiej postaci:

  1. INSERT INTO `quest_template` VALUES ('114', 'The Escape', 'Zanies eliksir niewidzialnosci do mlodej Maybell. Powinno dzialac wystarczajaco dlugo aby mogla spotkac sie z Tommy Joe.', 'Zanies Invisibility Liquor do Maybell Maclure.', 'Ojej! Czuje sie winna niesluchajac mojej rodziny, ale moje uczucie do Tommy Joe jest zbyt silne aby je zignorowac.$b$bDziekuje ci, $N. Wypije ten eliksir jak tylko bende miala okazje i wymkne sie spotkac z moja miloscia.$b$bA dla ciebie... prosze wez to.', 'Dostarczyles moj list do Tommy Joe? Co powiedzial?', '0');
  2. INSERT INTO `quest_template` VALUES ('62', 'The Fargodeep Mine', 'Kopalnia w Northshire nie jest jedyna która ma problemy! Doniesiono mi ze Fargodeep Mine w Elwynn także stała sie siedziba Kobolds.$B$B Zwiedź kopalnie i potwierdź te pogłoski, następnie wróć do mnie. Kopalnie znajduje sie na południe od Goldshire, pomiędzy farmami Stonefield i Maclure.', 'Zwiedź Fargodeep Mine, następnie powróć do Marshal Dughan w Goldshire.', 'To są złe nowiny. Co będzie następne, smoki?!? Będziemy musieli zwiększyć liczbę patroli w pobliżu kopalni. Dziękuje za twój wysiłek, $N. Aha poczekaj chwilkę... Możliwe ze mam dla ciebie następne zadanie.', 'Co masz mi do powiedzenia, $N? Byleś już w Fargodeep Mine?', '0');


Jest ich 2k każdy inny..

Nie mam zielonego pojęcia jak to dostosować pod dane pobierane z pliku txt..
athei
Zmieniłem poprzednią wersję i dodałem pobieranie z pliku.
  1. $src= 'plik.txt'; //ścieżka do pliku z INSERTami
  2. $inserty=file($src); //każdy INSERT w array
  3. $updates=array();
  4. $i=0;
  5. foreach ($inserty as $insert)
  6. {
  7. preg_match_all("/'(.+)(?<!\\\)'/U", $insert, $match);
  8.  
  9. $updates[$i]="UPDATE `wyniki` SET title = '{$match[1][1]}' , Details = '{$match[1][2]}' , Objectives = '{$match[1][3]}' , OfferRewardText = '{$match[1][4]}' , RequestItemsTex = '{$match[1][5]}' , EndText = '{$match[1][6]}' WHERE `id`= {$match[1][0]};";
  10. $i++;
  11. }
  12. echo '<pre>',print_r($updates),'</pre>';

Updaty są w tablicy $updates. Jak to teraz zapisać do pliku to już sam sobie zrób. Manual php albo pogoogluj.
assasin
smile.gif Uratowałeś mi życie...
Może ktoś wie jak zmodyfikować wynik wyświetlania bo w tej chwili to tak wygląda:

  1. (
  2. [0] => UPDATE `quest_template` SET Title = 'The Escape' , Details = 'Zanies eliksir niewidzialnosci do mlodej Maybell. Powinno dzialac wystarczajaco dlugo aby mogla spotkac sie z Tommy Joe.' , Objectives = 'Zanies Invisibility Liquor do Maybell Maclure.' , OfferRewardText = 'Ojej! Czuje sie winna niesluchajac mojej rodziny, ale moje uczucie do Tommy Joe jest zbyt silne aby je zignorowac.$b$bDziekuje ci, $N. Wypije ten eliksir jak tylko bende miala okazje i wymkne sie spotkac z moja miloscia.$b$bA dla ciebie... prosze wez to.' , RequestItemsText = 'Dostarczyles moj list do Tommy Joe? Co powiedzial?' , EndText = '0' WHERE `entry`= 114;
  3. [1] => UPDATE `quest_template` SET Title = 'The Fargodeep Mine' , Details = 'Kopalnia w Northshire nie jest jedyna która ma problemy! Doniesiono mi ze Fargodeep Mine w Elwynn tak¿e sta³a sie siedziba Kobolds.$B$B ZwiedŸ kopalnie i potwierdŸ te pog³oski, nastêpnie wróÌ do mnie. Kopalnie znajduje sie na po³udnie od Goldshire, pomiêdzy farmami Stonefield i Maclure.' , Objectives = 'ZwiedŸ Fargodeep Mine, nastêpnie powróÌ do Marshal Dughan w Goldshire.' , OfferRewardText = 'To s¹ z³e nowiny. Co bêdzie nastêpne, smoki?!? Bêdziemy musieli zwiêkszyÌ liczbê patroli w pobli¿u kopalni. Dziêkuje za twój wysi³ek, $N. Aha poczekaj chwilkê... Mo¿liwe ze mam dla ciebie nastêpne zadanie.' , RequestItemsText = 'Co masz mi do powiedzenia, $N? Byleœ ju¿ w Fargodeep Mine?' , EndText = '0' WHERE `entry`= 62;


Żeby bezpośrednio wyświetlały się zapytania bez ,,[0] => ''
mortus
Zamiast echo '<pre>',print_r($updates),'</pre>'; pętla po $updates
  1. foreach($updates as $update) {
  2. echo $update . '<br />';
  3. }
assasin
Bardzo dziękuje:) Tobie i athei.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.