Jak przeszukać tabelę SQL

0

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

2

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

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

to musisz najpierw pobrać kolumny z danej tabeli:

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

A później zrobić zapytanie na zasadzie:

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%"
... 
0

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

0

no przecież Ci napisał:

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

0

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

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.

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/

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ź.

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?

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.

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 |
+---------+----------+----------+-----+
<?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.

0

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

$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.

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ę.

0

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

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

0

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

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ą?

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.

0

A w PDO jest coś takiego jak

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

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1