[php] 매개 변수가있는 SELECT 쿼리에 PDO 개체를 올바르게 사용하는 방법

SELECT쿼리 를 수행하기 위해 PHP.net 지침을 따르려고 시도했지만이 작업을 수행 하는 가장 좋은 방법이 확실하지 않습니다.

SELECT가능한 경우 매개 변수가있는 쿼리 를 사용 ID하여 name필드가 매개 변수와 일치 하는 테이블에서을 반환하고 싶습니다 . ID고유하므로 하나를 반환해야합니다 .

그런 다음 IDINSERT를 다른 테이블에 사용하고 싶으므로 성공했는지 여부를 결정해야합니다.

또한 재사용을 위해 쿼리를 준비 할 수 있다는 것도 읽었지만 이것이 어떻게 도움이되는지 잘 모르겠습니다.



답변

다음과 같은 데이터를 선택합니다.

$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);


답변

나는 최근에 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();


답변

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's say we need the second result, i.e. index of 1
    $row_id = $check[1]['id'];
    // do something
}


답변

약간의 완전한 답변이 여기에 있습니다.

    $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 연결기이며 id테이블 users을 기반으로 username사용하여fetch();

나는 이것이 누군가에게 도움이되기를 바랍니다.


답변

방법 1 : 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);

링크 에서 더 많은 것을 알고 싶습니다


답변

단일 페이지에서 인라인 코딩을 사용하고이 전체 예제를 사용하는 것보다 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 />";
}


답변