Próbowałem postępować zgodnie z instrukcjami PHP.net dotyczącymi wykonywania SELECT
zapytań, ale nie jestem pewien, jak najlepiej to zrobić.
Chciałbym SELECT
, jeśli to możliwe, użyć sparametryzowanego zapytania, aby zwrócić ID
w tabeli, w której name
pole pasuje do parametru. To powinno zwrócić jeden, ID
ponieważ będzie unikalny.
Chciałbym następnie jak korzystać z tego ID
za INSERT
w innej tabeli, więc będzie trzeba ustalić, czy to był udany, czy nie.
Czytałem również, że możesz przygotować zapytania do ponownego wykorzystania, ale nie byłem pewien, jak to pomaga.
$db = new PDO('mysql:dbname=your_database;host=localhost', 'junior', '444');
$statement->execute(array(':name' => "Jimbo"));
, można wyjaśnić udział Jimbo?:name
. Wywołanieexecute
tutaj odbywa się za pomocą asocjacyjnej tablicy symboli zastępczych -> par wartości. Zatem w tym przypadku:name
symbol zastępczy zostanie zastąpiony ciągiem znaków Jimbo. Zwróć uwagę, że nie polega to po prostu na zamianie ciągu znaków, ponieważ wartość jest albo uciekana, albo wysyłana innym kanałem niż rzeczywiste zapytanie, zapobiegając w ten sposób wszelkiego rodzaju atakom iniekcyjnym.Ostatnio pracowałem z PDO i powyższa odpowiedź jest całkowicie prawidłowa, ale chciałem tylko udokumentować, że poniższe działa również.
$nametosearch = "Tobias"; $conn = new PDO("server", "username", "password"); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sth = $conn->prepare("SELECT `id` from `tablename` WHERE `name` = :name"); $sth->bindParam(':name', $nametosearch); // Or sth->bindParam(':name', $_POST['namefromform']); depending on application $sth->execute();
źródło
Aby przygotować oświadczenie, możesz skorzystać z metod
bindParam
lubbindValue
. Sprawia to, że rzeczy są bardziej jasne na pierwszy rzut oka, zamiast robić.$check->execute(array(':name' => $name));
Szczególnie, jeśli wiążesz wiele wartości / zmiennych.Sprawdź jasny, łatwy do odczytania przykład poniżej:
$q = $db->prepare("SELECT id FROM table WHERE forename = :forename and surname = :surname LIMIT 1"); $q->bindValue(':forename', 'Joe'); $q->bindValue(':surname', 'Bloggs'); $q->execute(); if ($q->rowCount() > 0){ $check = $q->fetch(PDO::FETCH_ASSOC); $row_id = $check['id']; // do something }
Jeśli spodziewasz się wielu wierszy, usuń
LIMIT 1
i zmień metodę pobierania nafetchAll
:$q = $db->prepare("SELECT id FROM table WHERE forename = :forename and surname = :surname");// removed limit 1 $q->bindValue(':forename', 'Joe'); $q->bindValue(':surname', 'Bloggs'); $q->execute(); if ($q->rowCount() > 0){ $check = $q->fetchAll(PDO::FETCH_ASSOC); //$check will now hold an array of returned rows. //let's say we need the second result, i.e. index of 1 $row_id = $check[1]['id']; // do something }
źródło
$check = $q->fetch(PDO::FETCH_ASSOC); if (!empty($check)){ $row_id = $check['id']; // do something }
?Trochę kompletna odpowiedź jest tutaj, a wszystko jest gotowe do użycia:
$sql = "SELECT `username` FROM `users` WHERE `id` = :id"; $q = $dbh->prepare($sql); $q->execute(array(':id' => "4")); $done= $q->fetch(); echo $done[0];
Oto
$dbh
łącznik db PDO i na podstawieid
tabeliusers
otrzymaliśmyusername
użyciefetch();
Mam nadzieję, że komuś to pomoże, ciesz się!
źródło
fetchColumn()
aby uniknąć[0]
potrzeby. Pamiętaj też, aby używaćLIMIT 1
w SQL.Metoda 1: Metoda zapytania USE PDO
$stmt = $db->query('SELECT id FROM Employee where name ="'.$name.'"'); $results = $stmt->fetchAll(PDO::FETCH_ASSOC);
Pobieranie liczby wierszy
$stmt = $db->query('SELECT id FROM Employee where name ="'.$name.'"'); $row_count = $stmt->rowCount(); echo $row_count.' rows selected';
Metoda 2: Instrukcje z parametrami
$stmt = $db->prepare("SELECT id FROM Employee WHERE name=?"); $stmt->execute(array($name)); $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
Metoda 3: Powiązanie parametrów
$stmt = $db->prepare("SELECT id FROM Employee WHERE name=?"); $stmt->bindValue(1, $name, PDO::PARAM_STR); $stmt->execute(); $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); **bind with named parameters** $stmt = $db->prepare("SELECT id FROM Employee WHERE name=:name"); $stmt->bindValue(':name', $name, PDO::PARAM_STR); $stmt->execute(); $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); or $stmt = $db->prepare("SELECT id FROM Employee WHERE name=:name"); $stmt->execute(array(':name' => $name)); $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
Chcesz wiedzieć więcej, spójrz na ten link
źródło
jeśli używasz kodowania wbudowanego na jednej stronie i nie używasz oops, to przejdź do tego pełnego przykładu, z pewnością pomoże
//connect to the db $dbh = new PDO('mysql:host=localhost;dbname=mydb', dbuser, dbpw); //build the query $query="SELECT field1, field2 FROM ubertable WHERE field1 > 6969"; //execute the query $data = $dbh->query($query); //convert result resource to array $result = $data->fetchAll(PDO::FETCH_ASSOC); //view the entire array (for testing) print_r($result); //display array elements foreach($result as $output) { echo output[field1] . " " . output[field1] . "<br />"; }
źródło
field > 6969
wygląda na zakodowane, a nie sparametryzowane.