2010-06-27 2 views
1

필자는 자신의 PDO 랩퍼를 작성하여보다 쉽고 안전하게 사용할 수 있도록했습니다.PHP PDO에서 반환 형식을 변경하십시오. 선택

$user = $db->select('users') 
      ->eq('twitter_id', $twitter_id) 
      ->limit(1) 
      ->prepare() 
     ->exec(); 

이 쿼리를 생성 :

표준 쿼리처럼 보이는 내가 현재 그것을 원하는

SELECT * FROM users WHERE twitter_id = :twitter_id LIMIT 1

이 완벽하게 잘 작동합니다. 문제가 발생하는 곳은 여러 행을 반환하는 쿼리입니다.

내 앱

내가 잡아 한 번에 사용하려는 일부 동적 설정을 저장하고 난에 의해이 같은 쿼리를 실행하는 것이 수행 할 수 있습니다 생성

$share_datas = $db->select('settings', 'setting, value') 
        ->prepare() 
       ->exec(); 

:

SELECT setting, value FROM settings

을 어느 것이 반환합니까 :

Array 
(
    [0] => Array 
     (
      [setting] => since_id 
      [value] => 17124357332 
     ) 

    [1] => Array 
     (
      [setting] => last_dm 
      [value] => 1271237111 
     ) 
) 

함수 prepare()은 쿼리를 위해 조각을 함께 넣고 exec() 함수는 params를 바인딩하고 배열을 반환합니다.

function exec() 
    { 
//  echo 'vars: <pre>'.print_r($this->sql_vars, true).'</pre>'; 
     $stmt = $this->dbh->prepare($this->sql_last_query); 
     foreach($this->sql_vars as $key => $val) 
     { 
      if('date_time' === $key) continue; 
      $bind = $stmt->bindValue($key, $val); 
     } 
     $stmt->execute(); 
     $this->sql_vars = array(); 
     return $stmt->fetchAll(PDO::FETCH_ASSOC); 
    } 

이제 질문 : 그것은 아래와 같이 반환 및 추가 루프를 방지 배열을 반환 할 수 있도록 내가 exec()을 변경하거나 쿼리 자체 수있는 방법이 있나요?

Array 
(
    [since_id] => 17124357332 
    [last_dm] => 1271237111 
) 
+0

왜 나중에 php foreach 루프를 사용하여 처리하고 싶지 않은 이유가 있을까요? – Lukman

+0

기본적으로 가능한 경우 추가 루프를 피하려고 시도합니다. – Jayrox

답변

1

일부 간단한 배열 기능에는 문제가 없습니다.

$in = $db->exec(); 
$out = array(); 
foreach($in as $row) 
    $out[ $row['setting'] ] = $row['value']; 

보다 일반적인 기능이 필요한 경우 변환을 더 명확하게 설명해야합니다.

+0

이 작업을 수행 할 수 있습니다. 추가 루프가 발생하지 않도록하려면 루프를 피하십시오. – Jayrox

1

는 대답은 가능성 중 하나가 될 것입니다 :

  1. 단순히 실행을 수행하고 명령문 핸들을 저장 exec을 갖는 당신의 exec 다른 반환 행동 방법, 또는
  2. 의 여러 버전을 생성 한 다음 가져 오는이 데이터는 별도의 방법입니다.

    • 쿼리 "하나":

나는 현재의 해시의 배열에 추가하여, 다음과 같은 편리한 메소드 편리 발견했습니다 같은 것들에 대한 스칼라로 첫 번째 행의 첫 번째 열 (SELECT COUNT (*))

  • 쿼리 "목록": 모든 행의 첫 번째 열을 색인 된 배열로 지정합니다 (예 : SELECT id FROM ...))
  • 쿼리 "쌍": 해시로 현재 행의 모든 ​​행의 처음 두 열
  • "insert id"쿼리 : 마지막으로 생성 된 행 ID를 스칼라로 (MySQL에서 자동 증가, Postgres 등)
  • PDO (및 대부분의 다른 데이터베이스 어댑터)에는 처리 할 기본 제공 플래그가없는 경우가 있습니다.

    관련 문제