Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Przeszukiwanie ciągu
Forum PHP.pl > Forum > Przedszkole
henio
Mam taki problem, otóż pobieram z jednej tabeli bazy danych MySQL rekord, który przykładowo wygląda tak:
"11 , 14"

Potem pobieram z drugiej tabeli konkretne id np 1 czy 11

I chce sprawdzić czy to konkretne id zawiera się w tym 'grupowym'

  1. <?php
  2. // Sprawdzenie za pomocą funkcji strstr() czy dany użytkownik ma już uprawnienia
  3. if(strstr($rekord1['id_uzytkownikow'], $rekord2['id_uzytkownik']))
  4. {
  5. echo "<tr><td><input type=\"checkbox\" name=\"".$rekord2['id_uzytkownik']."\" value=\"".$rekord2['id_uzytkownik']."\" checked=\"checked\" /> ".$rekord2['login']." - ".$rekord2['zarejestrowany']."</td></tr>\n";
  6. }
  7. else
  8. {
  9. echo "<tr><td><input type=\"checkbox\" name=\"".$rekord2['id_uzytkownik']."\" value=\"".$rekord2['id_uzytkownik']."\" /> ".$rekord2['login']." - ".$rekord2['zarejestrowany']."</td></tr>\n";
  10. }
  11. ?>


No, ale wówczas skrypt 'myśli', że zarówno 1 jak i 11 się zawiera, choć tylko ten drugi jest. Pytanie moje, jak to rozwiązać?
Maxik
Tego pierwszego stringa exploduj i potem w pętli foreach przesiej.
henio
Cytat(Maxik @ 13.08.2008, 16:45:14 ) *
Tego pierwszego stringa exploduj i potem w pętli foreach przesiej.


Zrobiłem jak pisałeś i zaznacza się tylko jedno id, a w bazie danych ma cos takiego "1 , 6"

  1. <?php
  2. // Rozdzielenie zmiennej $rekord1['id_uzytkownikow'] za pomocą funkcji explode()
  3. $id_uzytkwnikow2 = explode(" , ", $rekord1['id_uzytkownikow']); 
  4.  
  5. foreach($id_uzytkwnikow2 as $id)
  6. {
  7.  
  8. // Wyświetlenie danych za pomocą pętli while
  9. while($rekord2 = mysqli_fetch_assoc($zapytanie2))
  10. {
  11.  
  12.  
  13.  
  14. // Sprawdzenie za pomocą funkcji strstr() czy dany użytkownik ma już uprawnienia
  15. if($id == $rekord2['id_uzytkownik'])
  16. {
  17. echo "<tr><td>".$id."<input type=\"checkbox\" name=\"".$rekord2['id_uzytkownik']."\" value=\"".$rekord2['id_uzytkownik']."\" checked=\"checked\" /> ".$rekord2['login']." - ".$rekord2['zarejestrowany']."</td></tr>\n";
  18. }
  19. else
  20. {
  21. echo "<tr><td><input type=\"checkbox\" name=\"".$rekord2['id_uzytkownik']."\" value=\"".$rekord2['id_uzytkownik']."\" /> ".$rekord2['login']." - ".$rekord2['zarejestrowany']."</td></tr>\n";
  22. }
  23.  
  24. }
  25. }
  26. ?>
aa
CODE

// $id_uzytkwnikow2 zawiera 0=>11, 1=>14
// $id_uzytkownik = 11

foreach($id_uzytkownikow as $id) {
if($id_uzytkownik == $id) echo $id;

}




chyba o to chodziło?
henio
Cytat(aa @ 13.08.2008, 17:48:18 ) *
CODE

// $id_uzytkwnikow2 zawiera 0=>11, 1=>14
// $id_uzytkownik = 11

foreach($id_uzytkownikow as $id) {
if($id_uzytkownik == $id) echo $id;

}


chyba o to chodziło?

Nie

bo:

  1. <?php
  2. // Rozdzielenie zmiennej $rekord1['id_uzytkownikow'] za pomocą funkcji explode()
  3. $id_uzytkwnikow2 = explode(" , ", $rekord1['id_uzytkownikow']); 
  4.  
  5. // $id_uzytkwnikow2['0'] = "1"
  6. // $id_uzytkwnikow2['1'] = "6"
  7.  
  8. foreach($id_uzytkwnikow2 as $id)
  9. {
  10.  
  11. // Wyświetlenie danych za pomocą pętli while
  12. while($rekord2 = mysqli_fetch_assoc($zapytanie2))
  13. {
  14.  
  15.  
  16.  
  17. // Sprawdzenie za pomocą funkcji strstr() czy dany użytkownik ma już uprawnienia
  18. if($rekord2['id_uzytkownik'] == $id)
  19. {
  20. echo "<tr><td><input type=\"checkbox\" name=\"".$rekord2['id_uzytkownik']."\" value=\"".$rekord2['id_uzytkownik']."\" checked=\"checked\" /> ".$rekord2['login']." - ".$rekord2['zarejestrowany']."</td></tr>\n";
  21. }
  22. else
  23. {
  24. echo "<tr><td><input type=\"checkbox\" name=\"".$rekord2['id_uzytkownik']."\" value=\"".$rekord2['id_uzytkownik']."\" /> ".$rekord2['login']." - ".$rekord2['zarejestrowany']."</td></tr>\n";
  25. }
  26.  
  27. }
  28. }
  29. ?>


Teraz zaznaczony jest tylko ten użytkownik, który ma id 1 a powinien być także zaznaczony ten, który ma id 6
calebos
Bardzo to komplikujecie napisz dokladnie co jest w tablicach i jak o to pytasz mysql'a.
Na 100% da sie to sprowadzic do zaptania mysql ktore zwroci 1 row z danymi ktore chcesz przyrownac do czegos.
henio
Cytat(calebos @ 14.08.2008, 09:17:22 ) *
Bardzo to komplikujecie napisz dokladnie co jest w tablicach i jak o to pytasz mysql'a.
Na 100% da sie to sprowadzic do zaptania mysql ktore zwroci 1 row z danymi ktore chcesz przyrownac do czegos.


Prosze dłuższy fragment kodu
  1. // Wyświetlenie nagłówka strony
  2. naglowek("Zarządzaj uprawnieniami dotyczącymi skryptu ".$_GET['nazwa_skrypt']);
  3. include("naglowek.php");
  4. include("menu.php");
  5. echo "<div id=\"tresc\">\n";
  6.  
  7. // Pobranie z bazy danych wybranego skryptu
  8. $zapytanie1 = mysqli_query($mysql, "SELECT id_uprawnienie, nazwa_skrypt, id_uzytkownikow
  9. FROM redakcja_uprawnienia
  10. WHERE nazwa_skrypt = \"".$_GET['nazwa_skrypt']."\"
  11. LIMIT 1")
  12. or die ('Zapytanie jest błędne!<br />'.mysqli_error($mysql));
  13.  
  14. while($rekord1 = mysqli_fetch_assoc($zapytanie1))
  15. {
  16.  
  17. // Wyświetlenie formularza
  18. echo "<form action=\"uprawnienia_zarzadzaj.php?nazwa_skrypt=".$_GET['nazwa_skrypt']."\" method=\"post\" />\n";
  19. ?>
  20. <h2>Wybierz użytkowników</h2>
  21. <table>
  22. <?php
  23.  
  24. // Sprawdzenie czy wybrany skrypt ma już wybrane uprawnienia
  25. if($rekord1['id_uzytkownikow'] != 0)
  26. {
  27.  
  28. // Pobranie z bazy danych loginu i id wszystkich redaktorów
  29. $zapytanie2 = mysqli_query($mysql, "SELECT id_uzytkownik, login, zarejestrowany
  30. FROM uzytkownicy
  31. WHERE zarejestrowany != \"Uzytkownik\" AND zarejestrowany != \"Zbanowany\"
  32. ORDER BY login ASC")
  33. or die ('Zapytanie jest błędne!<br />'.mysqli_error($mysql));
  34. // Pobranie liczby redaktorów
  35. echo "<input type=\"hidden\" name=\"ile_redaktorow\" value=\"".mysqli_num_rows($zapytanie2)."\" />\n";
  36.  
  37. // Rozdzielenie zmiennej $rekord1['id_uzytkownikow'] za pomocą funkcji explode()
  38. $id_uzytkwnikow2 = explode(" , ", $rekord1['id_uzytkownikow']); 
  39.  
  40. foreach($id_uzytkwnikow2 as $id)
  41. {
  42.  
  43. // Wyświetlenie danych za pomocą pętli while
  44. while($rekord2 = mysqli_fetch_assoc($zapytanie2))
  45. {
  46.  
  47.  
  48.  
  49. // Sprawdzenie za pomocą funkcji strstr() czy dany użytkownik ma już uprawnienia
  50. if($rekord2['id_uzytkownik'] == $id)
  51. {
  52. echo "<tr><td><input type=\"checkbox\" name=\"".$rekord2['id_uzytkownik']."\" value=\"".$rekord2['id_uzytkownik']."\" checked=\"checked\" /> ".$rekord2['login']." - ".$rekord2['zarejestrowany']."</td></tr>\n";
  53. }
  54. else
  55. {
  56. echo "<tr><td><input type=\"checkbox\" name=\"".$rekord2['id_uzytkownik']."\" value=\"".$rekord2['id_uzytkownik']."\" /> ".$rekord2['login']." - ".$rekord2['zarejestrowany']."</td></tr>\n";
  57. }
  58.  
  59. }
  60. }
  61. }
  62. else
  63. { // Jeśli nie to wyświetli się lista redaktorów
  64.  
  65.  
  66. $zapytanie3 = mysqli_query($mysql, "SELECT id_uzytkownik, login, zarejestrowany
  67. FROM uzytkownicy
  68. WHERE zarejestrowany != \"Uzytkownik\" AND zarejestrowany != \"Zbanowany\"
  69. ORDER BY login ASC")
  70. or die ('Zapytanie jest błędne!<br />'.mysqli_error($mysql));
  71.  
  72. // Pobranie liczby redaktorów
  73. echo "<input type=\"hidden\" name=\"ile_redaktorow\" value=\"".mysqli_num_rows($zapytanie3)."\" />\n";
  74.  
  75.  
  76. while($rekord3 = mysqli_fetch_assoc($zapytanie3))
  77. {
  78. echo "<tr><td><input type=\"checkbox\" name=\"".$rekord3['id_uzytkownik']."\" value=\"".$rekord3['id_uzytkownik']."\" /> ".$rekord3['login']." - ".$rekord3['zarejestrowany']."</td></tr>\n";
  79. }
  80. }
  81. ?>
  82. <tr><th><input type="submit" name="czy" value="Dodaj" /></th><tr>
  83. </table>
  84. <?php
  85.  }
  86. }
  87. // Wyświetlenie stopki
  88. echo "</div>\n";
  89. include("stopka.php");


W tablicu po explodowaniu mam:
$id_uzytkwnikow2['0'] = "1"
$id_uzytkwnikow2['1'] = "6"
calebos
Zapytanie zwroci ci wszystkich przypisanych do 'nazwa_skrypt' razem z ich danymi z tablicy user'ow dopisz tylko pola.
Teraz tylko dobry WHERE i mysql da ci to co chcesz.

Jak jest duzo join'ow warto ustawic sobie jakies VIEW.


  1. <?php
  2. $varfromget=$_GET['nazwa_skrypt'];
  3.  
  4. $query="SELECT
  5. id_uprawnienie, nazwa_skrypt, id_uzytkownikow,FROM redakcja_uprawnienia
  6. LEFT JOIN uzytkownicy
  7. ON uprawnienia.id_uzytkownikow=uzytkownicy.id_uzytkownica
  8. WHERE nazwa_skrypt ='$varfromget'";
  9. ?>
henio
celebos nie zrozumiałeś do końca

W tabeli z uprawnieniami mam: "1 , 6"
gdzie 1 to id i 6 to id

  1. <?php
  2. // Pobranie z bazy danych wybranego skryptu
  3. $zapytanie1 = mysqli_query($mysql, "SELECT id_uprawnienie, nazwa_skrypt, id_uzytkownikow
  4. FROM redakcja_uprawnienia
  5. WHERE nazwa_skrypt = \"".$_GET['nazwa_skrypt']."\"
  6. LIMIT 1")
  7. or die ('Zapytanie jest błędne!<br />'.mysqli_error($mysql));
  8. ?>

Mam już to z nazwą skryptu
calebos
Nie rozumiem masz identyfikatory uzytkownikow w jednym polu w tablicy uprawnienia ? $row[rezultat1]='1,5,43,543,123' ?!
Bez sensu odebrales sobie wszystkie opcje jakie daje Ci baza danych wlasnie do takich zlaczen.
Juz chyba lepiej robic 10 wpisow z tym samym userem a innym skryptem nizeli w ten sposob normalizowac baze i nie miec mozliwosci dac joina.

Nie wyszukasz w stringu "6" bo jak napisales wywali ci np "16" jako rezultat.
Mozesz dodac na poczatek i koniec kazdego ciagu w 'grupowych' indentyfikatorach "," (sam przecinek).
Wtedy bedziesz mial 'separator' do swoich wartosci i mozesz prawidlowo przyronac

W ten sposob trzeba bedzie wyszukiwac przy pomocy like w polu co nie jest zbyt wydajnei zalecane.

if strlen($x)==1
{
$y=",".$x.",";
select..... where id_costam like '%$y%';
}
henio
Powiedz jak byś mi to radził zrobić. Wytłumacz, jak możesz, jak najbardziej dokładnie.
calebos
Nie napisales czy tworzysz to dopiero czy jest juz tam z milion wpisow.

Tach fachowo to Cos kolo 3 postaci normalnej byloby chyba utworzenie grup z przywilejami aby zawieraly wszystkie mozliwe kombinacje.

Ale jesli to zastosoanie nie na jakies ogromne obciazenia to wystarczy cos takiego

id1.skrypt ------ id.skryptu.JAN.NOWAK
id2.skrypt ------ id.skryptu.JAN NOWAK

Postac normalna potem napisze bo musze leciec.

Rozumiem ze jest jakas okreslona ilosc skryptow?
m
Cytat(calebos @ 14.08.2008, 12:58:04 ) *
if strlen($x)==1
{
$y=",".$x.",";
select..... where id_costam like '%$y%';
}

jest inna mozliwość bez dodawania , przed i po zmiennej np.
CODE
SELECT FIND_IN_SET('4', '1,2,44,444,4')

zwróci 5 czyli pozycję ściśle dopasowanejwartości a
CODE
SELECT FIND_IN_SET('4', '1,2,44,444')
zwróci 0.
Czyli możnaby napisac 'SELECT FIND_IN_SET($x, nazwa_pola) FROM .......... WHERE ..............'
calebos
Co nadal nie rozwiazuje do konca sprawy.
Zamiast prostego JOIN'a masz dwa selecty do tego z przeszukiwaniem wewnatrz pola.

Trzeba to przerobic na 3 tablice albo powtarzac wpisy w tablicy users.
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.