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.
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);
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();
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
}
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!
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);
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 />";
}
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;
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