Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wiele zapytan SQL w php
Forum PHP.pl > Forum > PHP
musiek86
Mam w pliku dość sporo zapytań w formie
  1. $zapytanie = "CREATE TABLE warningtypes (
  2. tid int unsigned NOT NULL auto_increment,
  3. title varchar(120) NOT NULL default '',
  4. points int unsigned NOT NULL default '0',
  5. expirationtime bigint(30) NOT NULL default '0',
  6. PRIMARY KEY (tid)
  7. ) ENGINE=MyISAM;";
  8. $zapytanie2 = "CREATE TABLE warninglevels (
  9. lid int unsigned NOT NULL auto_increment,
  10. percentage int(3) NOT NULL default '0',
  11. action text NOT NULL,
  12. PRIMARY KEY (lid)
  13. ) ENGINE=MyISAM;"";

Po kazdym zapytaniu aby było dodane do bazy trzeba je wykonać
  1. $wynik = mysql_query($zapytanie);

Jesli takich tabel bym miał z 70 to pisanie tego 70 razy było by dość nie profesjonalne. Na pewno da sie to jakoś w szybszy i czytelniejszy sposób załatwić, tylko jak?
Widziałem gdzieś kod wygladający mniej wiecej tak
  1. [b]$zapytanie[] [/b]= "CREATE TABLE warningtypes (
  2. tid int unsigned NOT NULL auto_increment,
  3. title varchar(120) NOT NULL default '',
  4. points int unsigned NOT NULL default '0',
  5. expirationtime bigint(30) NOT NULL default '0',
  6. PRIMARY KEY (tid)
  7. ) ENGINE=MyISAM;";
  8. [b]$zapytanie[] [/b]= "CREATE TABLE warninglevels (
  9. lid int unsigned NOT NULL auto_increment,
  10. percentage int(3) NOT NULL default '0',
  11. action text NOT NULL,
  12. PRIMARY KEY (lid)
  13. ) ENGINE=MyISAM;"";

Nie rozumiem o co w tym chodzi, to zapytania ujete w tablicach (array)?
lukaskolista
Co w tym nieprofesjonalnego? Jest 70 roznych tabel z roznymi kolumnami, wiec musi byc 70 zapytan tworzacych te tabele.
musiek86
Wyobrazasz sobie kod skryptu gdzie masz 70 takich linijek? Czy tego nie mozna jakos skrócic?
d3ut3r
Jeden ze sposobów:
  1. $sql[]='CREATE TABLE `nazwa1` .....';
  2. $sql[]='CREATE TABLE `nazwa2` .....';
  3. $sql[]='CREATE TABLE `nazwa3` .....';
  4.  
  5. foreach ($sql as $query){
  6.  
  7. //tutaj wykonanie zapytania ze zmiennej $query
  8.  
  9. }


d.stp
pętla
musiek86
Cytat(d3ut3r @ 2.08.2012, 21:25:41 ) *
Jeden ze sposobów:
  1. $sql[]='CREATE TABLE `nazwa1` .....';
  2. $sql[]='CREATE TABLE `nazwa2` .....';
  3. $sql[]='CREATE TABLE `nazwa3` .....';
  4.  
  5. foreach ($sql as $query){
  6.  
  7. //tutaj wykonanie zapytania ze zmiennej $query
  8.  
  9. }


O to takie cos własnie widziałem ale co to za zapytanie w tej zmiennej $query ma byc?
Pewnie teraz głupote walnąłem ale to to:
  1. $wynik = mysql_query($zapytanie);
d3ut3r
Takie które chcesz wykonać czyli np CREATE TABLE do tworzenia tabel INSERT do wstawiania rekordów UPDATE, inne pochodne CREATE czego dusza zapragnie smile.gif
musiek86
Hym cos nie gra. Mam teraz tak
  1. $tables[] = "CREATE TABLE prefix__.$nazwa.__warninglevels (
  2. lid int unsigned NOT NULL auto_increment,
  3. percentage int(3) NOT NULL default '0',
  4. action text NOT NULL,
  5. PRIMARY KEY (lid)
  6. ) ENGINE=MyISAM;";
  7.  
  8. $tables[] = "CREATE TABLE prefix__.$nazwa.__warningtypes (
  9. tid int unsigned NOT NULL auto_increment,
  10. title varchar(120) NOT NULL default '',
  11. points int unsigned NOT NULL default '0',
  12. expirationtime bigint(30) NOT NULL default '0',
  13. PRIMARY KEY (tid)
  14. ) ENGINE=MyISAM;";
  15.  
  16. foreach ($tables as $tworz_tabele){
  17. $tworz_tabele = mysql_query($tables);
  18. }

W odpowiedzi otrzymuje komunikat
  1. Warning: mysql_query() expects parameter 1 to be string, array given in /jakas_sciezka/jakis_plik.php on line 1054

Linia odpowiada $tworz_tabele = mysql_query($tables);
d3ut3r
manual -> foreach bez podstaw języka nie ma sensu bawić się w bazy danych. Poćwicz podstawy później trudniejsze tematy będą o wiele łatwiejsze.
rzymek01
Wydaje mi się, że najszybciej będzie stworzyć plik z zapytaniami, a następnie go załadować:
http://dev.mysql.com/doc/refman/5.5/en/mysql.html
irekk
A polecenie delimiter to wy znacie? wink.gif
musiek86
Poczytałem i wydaje mi sie ze załapałem ocb. Teraz mam tak
  1. <?php
  2. $tables[] = "CREATE TABLE `prefix__.$nazwa.__warninglevels` (
  3. lid int unsigned NOT NULL auto_increment,
  4. percentage int(3) NOT NULL default '0',
  5. action text NOT NULL,
  6. PRIMARY KEY (lid)
  7. ) ENGINE=MyISAM;";
  8.  
  9. $tables[] = "CREATE TABLE `prefix__.$nazwa.__warningtypes` (
  10. tid int unsigned NOT NULL auto_increment,
  11. title varchar(120) NOT NULL default '',
  12. points int unsigned NOT NULL default '0',
  13. expirationtime bigint(30) NOT NULL default '0',
  14. PRIMARY KEY (tid)
  15. ) ENGINE=MyISAM;";
  16.  
  17. $tables[] = "CREATE TABLE `prefix__.$nazwa.__warnings` (
  18. wid int unsigned NOT NULL auto_increment,
  19. uid int unsigned NOT NULL default '0',
  20. tid int unsigned NOT NULL default '0',
  21. pid int unsigned NOT NULL default '0',
  22. title varchar(120) NOT NULL default '',
  23. points int unsigned NOT NULL default '0',
  24. dateline bigint(30) NOT NULL default '0',
  25. issuedby int unsigned NOT NULL default '0',
  26. expires bigint(30) NOT NULL default '0',
  27. expired int(1) NOT NULL default '0',
  28. daterevoked bigint(30) NOT NULL default '0',
  29. revokedby int unsigned NOT NULL default '0',
  30. revokereason text NOT NULL,
  31. notes text NOT NULL,
  32. PRIMARY KEY (wid)
  33. ) ENGINE=MyISAM;";
  34.  
  35. foreach ($tables as $tworz_tabele){
  36. $wynik = mysql_query($tworz_tabele);
  37. }
  38. if (!$wynik) {
  39. die('Błąd zapytania: ' . mysql_error());
  40. }
  41.  
  42. ?>

No i po wykonaniu tabele sie tworzą, wiec sukces, aczkolwiek tu pojawia sie mały inny błąd a mianowicie do skryptu przekazywana jest zmienna $nazwa dajmy nato ze $nazwa to "musiek" no to tworzą sie tabele
  1. prefix__.musiek.__warninglevels

Problemem są te kropki przed nazwa zmiennej i po niej.
d3ut3r
sam te kropki wstawiłeś smile.gif łańcuchy znaków łączy się tak:

  1. $tekst='zmienna a='.$a.' !!!'; //dobrze
  2. $tekst="zmienna a=$a !!!"; //średnio dobrze
  3. $tekst="zmienna a=".$a."!!!"; //średnio dobrze
  4. $tekst="zmienna a=.$a.!!!!"; //źle


Pilsener
A nie prościej po prostu:
  1. CREATE TABLE tabela1 .... ; CREATE TABLE tabela2 ; CREATE TABLE tabela3


  1. $create_table_sql [] = 'create table tabela1 ....';
  2. $create_table_sql [] = 'create table tabela2 ....';
  3. $create_table_sql [] = 'create table tabela3 ....';
  4. mysql_query(join(';',$create_table_sql));


Po co się rozdrabniać?
musiek86
Po wpisaniu
$tables[] = "CREATE TABLE 'efora__'.$nazwa.'__adminlog' ..." //nie utworzyło mi tabeli
$tables[] = "CREATE TABLE 'efora__'$nazwa'__adminlog' ..." // nie utworzyło mi tabeli
$tables[] = "CREATE TABLE `efora__`$nazwa`__`adminoptions` ..." // nie utworzyło mi tabeli
webdice
Bo chcesz utworzyć tabelę która nazywa się:

Kod
efora__'wartosc_zmiennej'__adminlog


I adekwatnie w nastepnych przykładach. Wyświetl sobie zapytanie i sprawdź gdzie masz błąd.
musiek86
Jak juz pisałem do pliku jest przesyłana zmienna $nazwa załóżmy ze to jest "musiek"
Wiec powinna sie tworzyć tabela efora__musiek__adminlog ale albo sie nie tworzy w ogole albo dostaje efora__.musiek.__adminlog
webdice
Poczytaj jak się łączy stringi. ~d3ut3r Ci już napisał jak się to robi, przy czym dla mnie prawidło jest tylko pierwszy sposób.
musiek86
Zmieniłem i mam tak:
  1. $tables[] = "CREATE TABLE 'efora__'.$nazwa.'__adminlog' (
  2. uid int unsigned NOT NULL default '0',
  3. ipaddress varchar(50) NOT NULL default '',
  4. dateline bigint(30) NOT NULL default '0',
  5. module varchar(50) NOT NULL default '',
  6. action varchar(50) NOT NULL default '',
  7. data text NOT NULL,
  8. KEY module (module, action)
  9. ) ENGINE=MyISAM;";

Gdzie jako $nazwa idzie abdupa Przy wykonywaniu skryptu otrzymuje błąd:
  1. 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 ''efora__'.abdupa.'__warnings' ( wid int unsigned NOT NULL auto_increment, uid ' at line 1

Dodam iż tabela efora__'.abdupa.'__warnings jest ostatnią tworzoną w tym skrypcie tabelą.
d3ut3r
rozpoczynasz łańcuch za pomocą " a chcesz go przerwać za pomocą '

  1.  
  2. $sql[]='CREATE TABLE `efora_'.$nazwa.'_adminlog` ........... ';
  3.  
musiek86
Np jak, przeciez rozpoczyna sie i kończy tym samym
$tables[] = "CREATE TABLE 'efora__'.$nazwa.'__adminlog' (
uid int unsigned NOT NULL default '0',
ipaddress varchar(50) NOT NULL default '',
dateline bigint(30) NOT NULL default '0',
module varchar(50) NOT NULL default '',
action varchar(50) NOT NULL default '',
data text NOT NULL,
KEY module (module, action)
) ENGINE=MyISAM;";
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.