• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zapytanie do bazy i znak zapytania

Object Storage Arubacloud
0 głosów
1,264 wizyt
pytanie zadane 14 maja 2017 w SQL, bazy danych przez Bartlomiej Bywalec (2,480 p.)

Mam pytanie kiedy przyrównuję się znakiem zapytania? w jakim momencie można go stosować?

Wytłumaczy mi ktoś?:) Wdzięczny byłbym bardzo :)

np:

$sql = "SELECT * from house where houses.id = ?";

1 odpowiedź

0 głosów
odpowiedź 14 maja 2017 przez Chess Szeryf (76,710 p.)
wybrane 15 maja 2017 przez Bartlomiej
 
Najlepsza

To jest tzw. "bindowanie", zabezpieczenie przed wstrzykiwaniem SQL oraz innymi niebezpieczeństwami. Zastosowanie tej techniki daje większe bezpieczeństwo aplikacji i nie tylko aplikacji.

Dam przykład z rozszerzenia mysqli, jest to również na PDO, tylko jest inna nazwa funkcji.

http://php.net/manual/en/mysqli-stmt.bind-param.php

$stmt = $mysqli->prepare("INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
$stmt->bind_param('sssd', $code, $language, $official, $percent);

W tym przykładzie masz 4 znaki zapytania. Oznacza to, że później trzeba podać 4 wartości.

Druga linia oznacza kolejno (te sssd): string, string, string, double.

Te zmienne dalej to odpowiedniki tego, co ustaliliśmy. Czyli 1. zmienna to typ string, 2. zmienna to też typ string, 3. zmienna też jest typu string, a ostatnia typu double/float.

komentarz 15 maja 2017 przez Bartlomiej Bywalec (2,480 p.)

Czyli w takim przypadku zbindowane zostalo w execute(array($id)); znak zapytania?

<?php session_start(); 
	require 'skrypt/database.php';
	if(!empty($_GET['id'])){
		$id = $_GET['id'];
		$pdo = Database::connect();
		$sql = "SELECT * from house where houses.id = ?";
		$q = $pdo->prepare($sql);
		$q->execute(array($id));
		$data = $q->fetch(PDO::FETCH_ASSOC); }
?>
komentarz 15 maja 2017 przez Chess Szeryf (76,710 p.)
edycja 15 maja 2017 przez Chess

http://webhelp.pl/artykuly/obsluga-baz-danych-za-pomoca-pdo/

Inny zapis tego wyglądałby np. tak:

$q->bindValue(1, $id, PDO::PARAM_INT);

Oczywiście, jeżeli zmienna $id ma nie być typu INT, to musisz wtedy zmienić PDO:PARAM_INT na jakąś inną stałą. Spis stałych masz pod tym adresem.

Zapraszam do lektury:

http://php.net/manual/en/pdostatement.execute.php

http://php.net/manual/en/pdostatement.bindvalue.php

Bindowana jest wartość. U ciebie zbindowana została zmienna:  $id = $_GET['id'];

komentarz 15 maja 2017 przez Bartlomiej Bywalec (2,480 p.)
Ostatnie pytanko tylko bym wiedzial czy sie nie myle czy nie

czyli jak zrobie przed zapytaniem

np

$id = $_GET['id'];

wtedy moge uzyc znaku zapytania w SQL?

a jakbym mial

$id = $_GET['id'];

$price = $_GET['price'];

To która bylaby zbindowana wartosc pod -> '?'

Prosze jeszcze tylko na to odpowiedziec i biore sie za lekture :P
komentarz 15 maja 2017 przez Chess Szeryf (76,710 p.)

Przecież wszystko jest w manualu:

$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < ? AND colour = ?');
$sth->bindValue(1, $calories, PDO::PARAM_INT);
$sth->bindValue(2, $colour, PDO::PARAM_STR);

Po bindValue w nawiasie, 1 oznacza pierwszą wartość. A 2 oznacza drugą wartość.

Czyli w tym przykładzie jest napisany select, który wyszukuje owoce, które mają mniej niż ? kalorii i jeszcze, które mają ? kolor.

1. znak zapytania to zmienna $calories, a 2. znak zapytania to zmienna $colour.

Jeśli jednak chodzi oto zapytanie, na przykład:

$q->execute(array(15, 30));

To pierwsza wartość jest równa 15, a druga 30.

1=>15, 2=>30.

komentarz 15 maja 2017 przez Bartlomiej Bywalec (2,480 p.)

No tak ale caly czas tlumaczysz z przykladem bindowania, to ja rouzmiem tylko tutaj nie ma bindowania i dlatego jestem ciekaw na jakiej zasadzie pobiera znak zapytania wartosc:

<?php session_start(); 
    require 'skrypt/database.php';
    if(!empty($_GET['id'])){
        $id = $_GET['id'];
        $pdo = Database::connect();
        $sql = "SELECT * from house where houses.id = ?";
        $q = $pdo->prepare($sql);
        $q->execute(array($id));
        $data = $q->fetch(PDO::FETCH_ASSOC); }
?>

 

stad?

$q->execute(array($id));

 

komentarz 15 maja 2017 przez Chess Szeryf (76,710 p.)

Przecież:

$q->execute(array($id));

Oznacza to samo, co:

$q->bindValue(1, $id, PDO::PARAM_INT);

Oczywiście, jeśli $id jest typu int, dajesz PDO:PARAM_INT. Jeśli jest innego typu, to wpisujesz tam inną stałą.

Ta linia, co napisałeś, nie pobiera znaku zapytania tylko podstawia za ten znak twoją zmienną, u ciebie ta zmienna to $id.

komentarz 15 maja 2017 przez Bartlomiej Bywalec (2,480 p.)

Dziekuje bardzo za wytlumaczenie smiley

komentarz 15 maja 2017 przez Chess Szeryf (76,710 p.)
Jeszcze raz ci rzucę tego link'a:

http://webhelp.pl/artykuly/obsluga-baz-danych-za-pomoca-pdo/

Wydaje mi się, że to jest po prostu dość dobry poradnik, który tłumaczy, co i jak. Gdybyś go przeczytał to byś raczej nie zadawałbyś tego typu pytań.
komentarz 15 maja 2017 przez Bartlomiej Bywalec (2,480 p.)

Ok zrobilem petle foreach z tego przykladu i dodatkowo wypisalem echo $id sprawdzajac czy ono przybralo zmienna id i nic nie wyswietla blad w konstrukcji to moze byc??

	<?php 
		

	if(!empty($_GET['id'])){
		$id = $_GET['id'];
		$pdo = Database::connect();
		$sql = "SELECT * from comments where attractions.id = ?";
		$q = $pdo->prepare($sql);
		$q->execute(array($id)); }
         
		
		foreach($q as $row){
		echo '<div class="row">';
		echo '<div class="col-md-4">';

		echo '<h3>' . $row['author'] . '</h3>';
		echo '<p>'. $row['email'] .'</p>';
        echo '<p>'. $row['comment'] .'</p>';
		echo '</div>';
		echo '</div>'; 
    }
			 ?>

 

komentarz 15 maja 2017 przez Chess Szeryf (76,710 p.)
Foreach pobiera dane z tablicy, gdzie ty masz tam tablicę?
komentarz 15 maja 2017 przez Bartlomiej Bywalec (2,480 p.)
No zapytanei do bazy a pozniej wyniki wypisuje?
komentarz 15 maja 2017 przez Chess Szeryf (76,710 p.)
Jeśli chcesz użyć foreach, to chyba coś musi ci tablicę zwrócić.

Napisz, co ci zwraca print_r($q);
komentarz 15 maja 2017 przez Bartlomiej Bywalec (2,480 p.)
edycja 15 maja 2017 przez Bartlomiej
		$pdo = Database::connect();
		$sql = "SELECT * from comments where attractions.id = ?";
		$q = $pdo->prepare($sql);
		$q->execute(array($id));
		$row = $q->fetch(PDO::FETCH_ASSOC); 

	  foreach($row as $wypisz){
		echo '<div class="row">';
		echo '<div class="col-md-4">';

		echo '<h3>' . $wypisz['author'] . '</h3>';
		echo '<p>'. $row['email'] .'</p>';
    echo '<p>'. $row['comment'] .'</p>';
		echo '</div>';
		echo '</div>'; 
    }

poprawilem ale nie wypisuje?

Warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\information.php on line 103

komentarz 15 maja 2017 przez Chess Szeryf (76,710 p.)

Radzę poczytać jak działa pętla foreach:

http://php.net/manual/en/control-structures.foreach.php

Napisz po prostu:

foreach($q as $row) {
   echo $row;
}

http://forum.php.pl/php_Invalid_argument_supplied_for_foreach_t72803.html

http://stackoverflow.com/questions/2630013/invalid-argument-supplied-for-foreach

Może tak napisz:

foreach((array)$q as $row) { 
   echo $row; 
}

Zrzutuj na tablicę.

Podobne pytania

0 głosów
1 odpowiedź 2,028 wizyt
pytanie zadane 27 sierpnia 2019 w C i C++ przez soq72630 Nowicjusz (180 p.)
0 głosów
0 odpowiedzi 315 wizyt
pytanie zadane 12 kwietnia 2022 w SQL, bazy danych przez Piotr Popławski Użytkownik (610 p.)
0 głosów
1 odpowiedź 359 wizyt
pytanie zadane 10 maja 2022 w SQL, bazy danych przez alpha.netrunner Gaduła (4,690 p.)

92,579 zapytań

141,429 odpowiedzi

319,657 komentarzy

61,962 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...