Как я могу правильно использовать объект PDO для параметризованного запроса SELECT
Я пробовал следовать инструкциям PHP.net для выполнения запросов SELECT
, но я не уверен, что это лучший способ сделать это.
Я хотел бы использовать параметризованный SELECT
запрос, если возможно, для возврата ID
в таблицу, где поле name
соответствует параметру. Это должно вернуть один ID
, потому что он будет уникальным.
Я хотел бы использовать этот ID
для INSERT
в другой таблице, поэтому мне нужно будет определить, было ли это успешным или нет.
Я также читал, что вы можете готовить запросы для повторного использования, но я не был уверен, как это помогает.
Ответы
Ответ 1
Вы выбираете такие данные:
$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
Вы вставляете то же самое:
$statement = $db->prepare("insert into some_other_table (some_id) values (:some_id)");
$statement->execute(array(':some_id' => $row['id']));
Я рекомендую настроить PDO для исключения исключений при ошибке. Затем вы получите PDOException
, если какой-либо из запросов завершится неудачно. Не нужно явно указывать. Чтобы включить исключения, вызовите это сразу после создания объекта $db
:
$db = new PDO("...");
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Ответ 2
Я работал с PDO в последнее время, и ответ выше полностью прав, но я просто хотел записать, что следующее работает также.
$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();
Ответ 3
Вы можете использовать методы bindParam
или bindValue
, чтобы помочь подготовить отчет.
Это делает вещи более ясными с первого взгляда вместо того, чтобы делать $check->execute(array(':name' => $name));
Особенно, если вы связываете несколько значений/переменных.
Проверьте приведенный ниже, удобный для чтения пример:
$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
}
Если вы ожидаете несколько строк удалить LIMIT 1
и измените метод выборки на 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 say we need the second result, i.e. index of 1
$row_id = $check[1]['id'];
// do something
}
Ответ 4
Ответ на полный бит litle здесь готов для всех:
$sql = "SELECT `username` FROM `users` WHERE `id` = :id";
$q = $dbh->prepare($sql);
$q->execute(array(':id' => "4"));
$done= $q->fetch();
echo $done[0];
Здесь $dbh
- PDO db connecter, и на основе id
из таблицы users
мы получаем username
, используя fetch();
Я надеюсь, что это поможет кому-то, Наслаждайтесь!
Ответ 5
Метод 1: метод запроса USE PDO
$stmt = $db->query('SELECT id FROM Employee where name ="'.$name.'"');
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
Получение количества строк
$stmt = $db->query('SELECT id FROM Employee where name ="'.$name.'"');
$row_count = $stmt->rowCount();
echo $row_count.' rows selected';
Метод 2: Выводы с параметрами
$stmt = $db->prepare("SELECT id FROM Employee WHERE name=?");
$stmt->execute(array($name));
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
Метод 3: Параметры привязки
$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);
Хотите узнать больше об этом ссылка
Ответ 6
если вы используете встроенное кодирование на одной странице и не используете oops, чем выполните этот полный пример, он обязательно поможет
//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 />";
}
Ответ 7
точно после строки подгонки добавить ниже код
echo $statement->queryString;