Jak prawidłowo użyć obiektu PDO dla parametryzowanego zapytania SELECT

Próbowałem podążać za PHP.net instrukcje wykonywania SELECT zapytań, ale nie jestem pewien, czy najlepszy sposób na zrobienie tego.

Chciałbym użyć parametryzowanego zapytania SELECT, jeśli to możliwe, aby zwrócić ID w tabeli, w której pole name pasuje do parametru. To powinno zwrócić jeden ID, ponieważ będzie unikalny.

Chciałbym następnie użyć {[2] } dla INSERT do innej tabeli, więc będę musiał określić, czy to się udało, czy nie.

Czytam też że możesz przygotować zapytania do ponownego użycia, ale nie byłem pewien, jak to pomaga.

Author: Simon East, 2009-04-20

7 answers

Wybieramy dane w ten sposób:

$db = new PDO("...");
$statement = $db->prepare("select id from some_table where name = :name");
$statement->execute(array(':name' => "Jimbo"));
$row = $statement->fetch(); // Use fetchAll() if you want all results, or just iterate over the statement, since it implements Iterator

Wstawiasz w ten sam sposób:

$statement = $db->prepare("insert into some_other_table (some_id) values (:some_id)");
$statement->execute(array(':some_id' => $row['id']));

Zalecam skonfigurowanie PDO do rzucania WYJĄTKÓW w przypadku błędu. Jeśli którekolwiek z zapytań się nie powiedzie, otrzymasz PDOException - nie ma potrzeby sprawdzania jawnie. Aby włączyć wyjątki, wywołaj to zaraz po utworzeniu obiektu $db:

$db = new PDO("...");
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
 156
Author: troelskn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-20 09:15:45

Ostatnio pracowałem z PDO i powyższa odpowiedź jest całkowicie słuszna, ale chciałem tylko udokumentować, że poniższe działania również działają.

$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();
 16
Author: SmashCode,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-02 20:11:41

Możesz użyć metod bindParam lub bindValue, aby pomóc w przygotowaniu Oświadczenia. To sprawia, że rzeczy bardziej jasne na pierwszy rzut oka zamiast robić $check->execute(array(':name' => $name));, zwłaszcza jeśli wiążesz wiele wartości/zmiennych.

Sprawdź przejrzysty, czytelny 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 oczekujesz wielu wierszy Usuń LIMIT 1 i zmień metodę fetch na fetchAll:

$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
}
 10
Author: Gillian Lo Wong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-11 19:26:12

Litle bit complete answer is here with all ready to use:

    $sql = "SELECT `username` FROM `users` WHERE `id` = :id";
    $q = $dbh->prepare($sql);
    $q->execute(array(':id' => "4"));
    $done= $q->fetch();

 echo $done[0];

Tutaj $dbh jest łącznikiem PDO db, a na podstawie id z tabeli users otrzymujemy username używając fetch();

Mam nadzieję, że to komuś pomoże, baw się dobrze!

 6
Author: Domuta Marcel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-30 09:09:18

Metoda 1: użyj metody zapytań 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: parametry Bind

$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

 2
Author: Sudhir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-09 09:53:22

Jeśli używasz kodowania inline na pojedynczej stronie i nie używasz oops niż przejdź z tym pełnym przykładem, to na pewno 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 />";
}
 -2
Author: Shiv Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-15 09:14:07

Dokładnie po linii prepareline dodaj poniższy kod

echo $statement->queryString;
 -2
Author: a.miadian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-21 09:46:58