2013-08-29 5 views
-1

누락 된 부분이나 데이터가 표시되지 않는 이유를 알 수 없습니다. 준비된 문을 사용하지 않으면 코드가 작동합니다. 준비된 문장을 사용할 때 코드가 더 이상 작동하지 않는 것 같습니다.prepared statement method .. confused

db.php를

Class Database{ 


public $mysqli; 
public function __construct($db_host, $db_user, $db_password, $db_name){ 

    $this->con = new mysqli($db_host, $db_user, $db_password, $db_name); 

} 

    public function selectUserInfo($id){ 

     $stmt = $this->con->prepare("SELECT * FROM users WHERE os_id = ?"); 
     $stmt->bind_param("s", $id); 
     if($stmt->execute() == FALSE){ 
      trigger_error($stmt->error, E_USER_ERROR); 
     }else{ 
      $data = array(); 
      while($row = $stmt->fetch()){ 
       $data[] = $row; 
      } 
      return $data; 
     } 

} 
} 

config.php 파일은

define("DBHOST","somehost"); 
define("DBUSER","someroot"); 
define("DBPASS","somepassword"); 
define("DB","my_database"); 

이 내 페이지에 그것을 표시 할 방법이다.

require 'global/db.php'; 
require_once 'config.php'; 
$db = new Database(DBHOST, DBUSER, DBPASS, DB); 
$data = $db->selectUserInfo($_GET['name']); 
foreach ($data as $key) { 
    # code... 
    echo $key['os_fname']; 
} 
+1

오류 메시지가 없습니다. 'name'이라는 GET 매개 변수를 전달하고 있습니까? 그렇다면 DB에'osd_id'가 해당 매개 변수와 같은 행이 있습니까? – Phil

+0

오류 메시지가 표시되지 않습니다. 내 $ _GET [ 'name']에 1의 값을 표시하고 싶습니다. – eaponz

+0

@ 에드거 그래서 * page *를 열 때 '? name = 1'이 (가) 있습니까? URL? – Phil

답변

0

경우.

무엇이 잘못 되었습니까? fetch은 연관 속성이 없으므로 bind_result을 사용해야합니다.

public function selectUserInfo($id) 
{ 
    $stmt = $this->con->prepare("SELECT * FROM users WHERE os_id=?"); 
    $stmt->bind_param('i', $id); 
    if(!$stmt->execute()) 
    { 
     trigger_error($stmt->error, E_USER_ERROR); 
    } 
    else 
    { 
     $bindVarArray = array(); 
     $data = array(); 
     $result; 
     $meta = $stmt->result_metadata(); 
     while ($column = $meta->fetch_field()) 
     { 
      $columnName = str_replace(' ', '_', $column->name); 
      $bindVarArray[] = &$result[$columnName]; 
     } 
     call_user_func_array(array($stmt, 'bind_result'), $bindVarArray); 

     $index = 0; 
     while ($stmt->fetch() != null) 
     { 
      foreach ($result as $k => $v) 
      { 
       $data[$index][$k] = $v; 
      } 
      $index++; 
     } 
     return $data; 
    } 
} 

그런 다음이처럼 읽도록 foreach를 사용할 수 있습니다 :

foreach ($data as $result) 
{ 
    echo $result['os_fname'], ' => ', $result['os_lname'], "\n"; 
} 

을 그리고 당신은 항상 볼 수 print_r을 사용할 수 있습니다 여기에

또한 fetch manual에서 제안 해킹입니다 결과 배열은 다음과 같습니다.

print_r($data); 
+0

아직 오류가 표시되지 않습니다. 내 페이지가 그냥 빈 것을 보여줍니다 .. – eaponz

+0

@ 에드거 그런 다음 error_log 파일을 보면 변수를 닫는 것을 잊었을 것입니다. 또는'global/db.php'와'config.php'의 내용을 게시하여 비밀 번호, 사용자 이름, ip 등과 같은 중요한 데이터를 삭제하십시오. – Prix

+0

위의 게시물을 편집했습니다 .. 내 foreach를 제거하고 그것을 print_r – eaponz

-3

DB의 od_id 유형은 문자열 또는 정수입니까? 우리가 문제가 당신의 foreach와 것을, 정의 된 것처럼 정수

public function selectUserInfo($id){ 

    $stmt = $this->con->prepare("SELECT * FROM users WHERE os_id = ?"); 
    $stmt->bind_param("i", $id);//use 'i' instead of 's' 

    if($stmt->execute() == FALSE){ 
     trigger_error($stmt->error, E_USER_ERROR); 
    }else{ 
     $data = array(); 
     while($row = $stmt->fetch()){ 
      $data[] = $row; 
     } 
     return $data; 
    } 

}

+0

나는 이미 bind_param의 정수로 문자열을 변경했습니다. – eaponz

+0

일부 오류 메시지가 표시됩니다 ... @ Edgar –

+0

오류 메시지가 표시되지 않습니다 – eaponz