Jak przeszukać tabelę SQL

Jak przeszukać tabelę SQL
A1
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 5 lat
  • Postów:171
0

Cześć. Da się w PHP np. w foreach, przeszukać tabelę SQL? Jeśli tak, to jak?

DE
  • Rejestracja:ponad 9 lat
  • Ostatnio:11 miesięcy
  • Postów:1788
2

Nie możesz czegoś takiego połączyć. Musisz najpierw coś wyciągnąć z bazy. Jeżeli twoim celem jest stworzenie czegoś takiego:

Kopiuj
SELECT * FROM table_name WHERE anything LIKE "%xyz%"

to musisz najpierw pobrać kolumny z danej tabeli:

Kopiuj
SELECT `COLUMN_NAME` 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA`='nazwa_bazy' 
    AND `TABLE_NAME`='nazwa_tabeli';

A później zrobić zapytanie na zasadzie:

Kopiuj
SELECT * FROM nazwa_tabeli
WHERE kolumna1_z_zapytania_wyzej LIKE "%xyz%"
OR kolumna2_z_zapytania_wyzej LIKE "%xyz%"
OR kolumna3_z_zapytania_wyzej LIKE "%xyz%"
... 
edytowany 2x, ostatnio: Desu
A1
W żadnym poradniku internetowym nie było, żeby najpierw pobierać kolumny. I ja też nie do końca rozumiem po co.
A1
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 5 lat
  • Postów:171
0

Nie bardzo rozumiem... Skąd mam wiedzieć np. jak nazywa się pierwsza kolumna...?

0

no przecież Ci napisał:

Kopiuj
SELECT `COLUMN_NAME` 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA`='nazwa_bazy' 
    AND `TABLE_NAME`='nazwa_tabeli';

wyciąga nazwy kolumn
potem z nazw kolumn sobie składasz zapytanie

A1
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 5 lat
  • Postów:171
0

Ok. Poczytam sobie o tych operatorach, bo kompletnie nie znam się na MySQL :P Dzięki.

DE
  • Rejestracja:ponad 9 lat
  • Ostatnio:11 miesięcy
  • Postów:1788
0
edytowany 2x, ostatnio: dzek69
A1
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 5 lat
  • Postów:171
0

Jeszcze pytanie. Jak znaleźć w tabeli konkretny wyraz, sprawdzić w którym jest wierszu i sprawdzić jakie są wyrazy w kolumnach obok niego, w tym samym wierszu. Jest 8 kolumn i niewiadoma liczba wierszy.

DE
  • Rejestracja:ponad 9 lat
  • Ostatnio:11 miesięcy
  • Postów:1788
1

@Adamek161 jaja sobie robisz? Pytając o takie rzeczy okazujesz brak szacunku dla nas i naszego czasu. To elementarna wiedza i miałbyś gotową odpowiedź po przeczytaniu np. tego http://www.w3schools.com/sql/sql_select.asp

Nie mówię tego bo jestem złośliwy, tylko 99,99% pytań początkujących zostało już rozwiązanych. Początkujący mało kiedy wymyśli coś tak skomplikowanego, żeby wymagało to interwencji innych doświadczonych głów, tylko po prostu jest leniwy i boi się zajrzeć do manuala.

The first step is thus to search Google. This step alone should answer 95% or more of your questions so, as basic as this sounds, we cannot emphasis this enough: FIRST SEARCH GOOGLE. For example, if you received an error message from the program you are trying to use, cut and paste the message directly into Google. Posting a forum question that could have been easily answered with a simple Google search is often seen as disrespectful of other users, and such a question will potentially be closed or deleted on many forums. If Google did not return a satisfactory answer, the next step is to read the manual of the program you are trying to use. If your question is about a file format, find and read the documentation of the format. If there is a Frequently Asked Questions (FAQ), you should definitely read that too. As the name implies, this document lists questions that come up frequently, so yours may be answered in there. For the manual, the FAQ or wiki site of the program, search for keywords that are related to your question. If you still have no answer, you should experiment some more and try to solve your problem yourself and ask for the help of a friend or colleague.

If you still are without an answer, you clearly need to post a question and you should find an appropriate forum to ask it. Once again, Google should be helpful. It is important to search the forum to see if the question has already been asked and answered, as is often the case.

https://www.biostars.org/p/75548/

edytowany 2x, ostatnio: Desu
A1
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 5 lat
  • Postów:171
0

Dobra, przepraszam. Nie zdaje sobie z tego sprawy. No, to w końcu jest forum. Nie mogłem znaleźć, to zapytałem. Myślę, że znalazłem odpowiedź.

A1
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 5 lat
  • Postów:171
0

To jeżeli trzeba najpierw pobrać kolumny, to to http://www.eioba.pl/a/1lnn/obsluga-mysqla-w-php i to http://php.net/manual/pl/function.mysql-fetch-rów.php Przykład #1 by nie zadziałało?

DE
  • Rejestracja:ponad 9 lat
  • Ostatnio:11 miesięcy
  • Postów:1788
1

W żadnym poradniku internetowym nie było, żeby najpierw pobierać kolumny. I ja też nie do końca rozumiem po co. -

Chcesz przeszukać tabelę i pobrać konkretny wiersz, w którym to słowo występuje. W SQL robisz to za pomocą klauzuli WHERE, ale musisz sprecyzować WHERE co? Nie możesz zrobić WHERE cokolwiek LIKE "%xyz%" (gdzieś chyba widziałem, że ktoś coś takiego wykombinował, ale było to podobno bardzo mało wydajne). Musisz zrobić WHERE nazwa_kolumny LIKE "%xyz%". Tylko, że jak podasz np. kolumnę name to szukasz tylko po wartościach w kolumnie name, a Ty chciałeś przeszukać całą tabelę, więc masz dwa wyjścia.

Wyjście nr 1) Z palca wypisać wszystkie kolumny, bo np. zajrzysz sobie do bazy i wiesz jakie te kolumny są i wtedy robisz warunki tak jak Ci wyżej napisałem albo
Wyjście (bardziej uniwersalne) nr 2) Pobierasz NAZWY KOLUMN z danej tabeli czyli tam imie nazwisko adres itd. i wtedy tworzysz "dynamicznie" warunki WHERE.
Drugie wyjście jest dużo lepsze, bo uniwersalne, a wszystko co uniwersalne jest lepsze.

Kopiuj
TABLA u_user
+---------+----------+----------+-----+
| user_id | name     | surname  | age |
+---------+----------+----------+-----+
|       1 | Jan      | Kowalski |  35 |
|       2 | Barbara  | Kowalska |  26 |
|       3 | Marian   | Kowalski |  69 |
|       4 | Jan      | Prosty   |  41 |
|       5 | Monika   | Janowska |  56 |
|       6 | Andrzej  | Prosty   |  33 |
|       7 | Jacek    | Prosty   |  45 |
|       8 | Mariana  | Morelowa |  32 |
|       9 | Eustachy | Morenga  |  92 |
|      10 | Marek    | Placek   |  11 |
|      11 | Anna     | Prosta   |  14 |
|      12 | Paula    | Guzik    |  25 |
+---------+----------+----------+-----+
Kopiuj
<?php
	ini_set('display_startup_errors',1);
	ini_set('display_errors',1);
	error_reporting(-1);
	
	// pod zmienne $host $dbname $user $pass wpisujesz odpowiednie dane
	$host = "localhost"; 
	$dbname = "";
	$user = "root";
	$pass = "";
	$tableName = "u_user";
	$search_value = "%Jan%";

	// Łączysz się z bazą
	$pdo = new PDO("mysql:host=".$host.";dbname=".$dbname, $user, $pass,
    	array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)
   	);

	// przygotowujesz zapytanie, które wyciąga nazwy kolumn
   	$getColumnsStmt = $pdo->prepare(
                "SELECT `COLUMN_NAME` 
				 FROM `INFORMATION_SCHEMA`.`COLUMNS` 
				 WHERE `TABLE_SCHEMA`= :db_name
				 AND `TABLE_NAME`= :table_name"
            );
    $getColumnsStmt->execute(array( // bindujesz parametry ochrona przed SQL Injection
    	':db_name'    => $dbname,
		':table_name' => $tableName)); 
    $columnNames = $getColumnsStmt->fetchAll(PDO::FETCH_COLUMN, 0); // argument zeby nie dostac tablicy wielowymiarowej
	
	var_dump($columnNames);
	/*
		array (size=4)
	  0 => string 'user_id' (length=7)
	  1 => string 'name' (length=4)
	  2 => string 'surname' (length=7)
	  3 => string 'age' (length=3)
  	*/

    $sql = "SELECT * FROM $tableName WHERE ";
    // $columnNames to tablica array(nazwakolumny, nazwakolumny, nazwakolumny);
    // implode sklei nam to rozdzielajac tym samym warunkiem LIKE
    $sql .= implode(" LIKE :search_value OR ", $columnNames) . " LIKE :search_value";
    
    var_dump($sql);
    /* 
    string 'SELECT * FROM u_user 
    		WHERE 
    			user_id LIKE :search_value 
    			OR name LIKE :search_value 
    			OR surname LIKE :search_value 
    			OR age LIKE :search_value' (length=136)
	*/

    $searchStmt = $pdo->prepare($sql);
    $searchStmt->execute(array(':search_value' => $search_value)); // bindujemy search_value
    $searchResult = $searchStmt->fetchAll(PDO::FETCH_ASSOC);

    echo "Znaleziono:";
    var_dump($searchResult);
    /*
    Znaleziono:
array (size=3)
  0 => 
    array (size=4)
      'user_id' => string '1' (length=1)
      'name' => string 'Jan' (length=3)
      'surname' => string 'Kowalski' (length=8)
      'age' => string '35' (length=2)
  1 => 
    array (size=4)
      'user_id' => string '4' (length=1)
      'name' => string 'Jan' (length=3)
      'surname' => string 'Prosty' (length=6)
      'age' => string '41' (length=2)
  2 => 
    array (size=4)
      'user_id' => string '5' (length=1)
      'name' => string 'Monika' (length=6)
      'surname' => string 'Janowska' (length=8)
      'age' => string '56' (length=2)
  	*/

Coś takiego powinno zadziałać. Przed chwilą przetetowałem, więc możesz to odpalić i masz wszystko gotowe. Mam nadzieję, że przeanalizuejsz ten kod i coś się nauczysz.

edytowany 10x, ostatnio: Desu
A1
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 5 lat
  • Postów:171
0

No dzięki. Ale nie zadziałałoby połączenie się z bazą i kod

Kopiuj
$result = mysql_query("
SELECT id, username 
FROM tabela 
WHERE username='$username'");

$row = mysql_fetch_row($result);

$id = $row[0];
echo "Twoje ID to: ".$id

Nie wiem, czy to powinno dokładnie tak wyglądać, bo dopiero zaczynam się uczyć. Działałoby ew. z małą poprawką? Chodziło o to, żeby przeszukać tabelę, a tu konkretnie, żeby dowiedzieć się jakie jest id użytkownika o nazwie $username.

edytowany 1x, ostatnio: Adamek161
DE
  • Rejestracja:ponad 9 lat
  • Ostatnio:11 miesięcy
  • Postów:1788
0

@Adamek161 Zadziałało by, tylko od samego początku chciałeś przeszukać calusieńką tabele, a nie jedną kolumnę. Dałem Ci wędkę, ale nic już więcej nie mogę zrobić, bo nie będę Cie prowadził za rączkę. Powiem Ci tylko dwie rzeczy na zakończenie 1) Nie używaj mysql tylko PDO (to co ja w swoim kodzie) i nie rób zapytań takich jak tutaj bo jak za $username ktoś Ci wpisze string "; DELETE FROM tabela" to Ci wypieprzy cała tabelę, albo jak będzie chciał to i całą bazę.

edytowany 1x, ostatnio: Desu
A1
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 5 lat
  • Postów:171
0

To jak mam zrobić, żeby mi nikt niczego nie zepsuł?

Tumeg
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 8 lat
  • Postów:687
0

Poczytać na temat PDO, a w szczególności na temat bindowania parametrów zapytania.
http://php.net/manual/en/book.pdo.php
http://code.tutsplus.com/tutorials/php-database-access-are-you-doing-it-correctly--net-25338

A1
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 5 lat
  • Postów:171
0

A czym różni się PDO? Co to za różnica? A w username można przefiltrować, żeby usunęło takie niebezpieczne wyrazy.

A1
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 5 lat
  • Postów:171
0

Nie rozumiem do czego są te strzałki "->" może mi ktoś podpowiedzieć? I dlaczego w drugim linku o PDO od kolegi Tumeg w zapytaniu query zamiast po prostu $name jest . $conn->quote($name)? Jeśli jest to tam napisane, to przepraszam, ale niebardzo doczytuję się po angielsku. I jeszcze co to są te atrybuty, w tym przypadku ERRMODE. Co one robią?

edytowany 2x, ostatnio: Adamek161
DE
  • Rejestracja:ponad 9 lat
  • Ostatnio:11 miesięcy
  • Postów:1788
0

Nie, nie można przefiltrować. Poza tym to dodatkowa niepotrzebna operacja o której możesz zapomnieć. Strzałki to odwołanie to metody/właściwości obiektu. I w tym miejscu ja juz sie poddaje. Włącz tutorial i ogarnij podstawy, co to obiekt, tablica, jakie mamy zmienne, podstawowe funkcje do operacji na stringach/tablicach itd. A jak nie rozumiesz materiałów po ang to tłumacz i jazda. Zabim zaczniesz biegać musisz nauczyć sie chodzić. Happy Coding.

A1
Wiem co to obiekt, tablica, znam zmienne. Tylko że o to co tutaj pytam, to właśnie to czego nie ma w tych poradnikach i dlatego tutaj piszę, bo porozmawiać z kimś kto się na tym zna to najlepsza opcja.
A1
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 5 lat
  • Postów:171
0

A w PDO jest coś takiego jak

Kopiuj
mysql_fetch_row()

w php? Czy właśnie o to chodzi, żeby dla bezpieczeństwa nie używać fetch? A jak nie ma czegoś takiego, albo żeby tak nie robić, to jest jakiś odpowiednik? Chodzi o to żeby dostać tablice i np. $row[0] to kolumna 1, $row[1] to kolumna 2 itd. a w tych kolumnach wartości po kolei? Dzięki

edytowany 1x, ostatnio: Adamek161
Tumeg
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 8 lat
  • Postów:687
0

Tutaj o to się rozbija żeby przed zapuszczeniem zapytania zrobić:
http://php.net/manual/en/pdostatement.bindparam.php
Co do fetcha:
http://php.net/manual/en/pdostatement.fetchall.php

Znalazłem u siebie jeszcze ten tutek, dokładniej masz wytłumaczone:
http://code.tutsplus.com/tutorials/why-you-should-be-using-phps-pdo-for-database-access--net-12059

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.