2014-09-03 2 views
-1

먼저 응답 할 때 가능한 한 간단하게 설명하고 PHP에 대해 비교적 새로운 것으로 설명하십시오. 어쨌든 내 문제는 왜 문자열 변환에 대한 연관 배열이 작동하지 않는지 이해할 수 없다는 것입니다. 기본적으로 여기에 설명 된 것과 동일한 모델을 사용하고 있습니다. PHP 5 arrays 아래로 스크롤하여 연관 배열의 예를 봅니다.문자열 변환 문제에 대한 연관 배열

주의 사항 : 나는 텍스트 상자에 "아담"을 제출할 때 어쨌든 난 항상 얻을 출력이이 정의되지 않은 인덱스 : queryStr C에서 : \ XAMPP \ htdocs를 \ 연습 \ SRC \ fetchigndatausingpdo.php 라인 (24) PID = 80 = 8 AND FirstName = adam AND 1 = adam AND LastName = 프레스턴 AND 2 = 프레스톤 AND 나이 = 17 AND 3 = 17 AND

아래의 코드는 제안 사항이 있으시면 알려주십시오. 또한 $ user 및 $ pass는 보안 상 이유로 의도적으로 숨겨져 있습니다. 만 쿼리에서 정확히 하나 개의 행을 수신 할 경우

<form action="fetchigndatausingpdo.php" method="post"> 
<input type="text" name="name"> 
<input type="submit" name="submit" value="submit"> 
</form> 

<?php 

$user = "adam"; 
$pass = "**********"; 


if(isset($_POST['name'])){ 
    try{ 
     $dbh = new PDO('mysql:host=localhost;dbname=my_db', $user, $pass, array(PDO::ATTR_PERSISTENT=>true)); 

     $stmt = $dbh->prepare("SELECT * FROM persons WHERE FirstName LIKE ?"); 
     $stmt->execute(array($_POST['name'])); 
     if($stmt->rowCount() > 0){ 
      $result = $stmt->fetchAll(); 
      $terms = count($result);  
      foreach($result as $person){ 
       foreach ($person AS $field => $value){ 
       $terms--; 
       $GLOBALS['queryStr'].= $field.' = '.$value; 
       if($terms){ 
        $GLOBALS['queryStr'].=' AND '; 
       } 
       }   
      } 
      echo $queryStr; 
     } 

    }catch(PDOException $e){ 
    echo $e->getMessage(); 
} 
} 

?> 
+1

http_build_query()를 사용하여 제공되는 연관 (또는 색인 된) 배열에서 URL 인코딩 된 쿼리 문자열을 생성 할 수 있습니다. http://php.net/manual/en/function.http-build-query.php – deadman

답변

0

, 당신은 대신 데이터베이스 핸들러의 fetch() 방법을 사용하도록 $result = $stmt->fetchAll(); 행을 변경할 수 있습니다. 그러면 $result 변수에 정확히 하나의 배열이 제공됩니다. 그렇게하면 더 이상 변경하지 않아도됩니다.

fetchAll()$result 변수에 배열을 넣기 때문에 변경이 필요합니다 (단 하나의 결과 만있는 경우에도 변경이 필요합니다). 당신이 fetchAll()fetch()에 변경되지 않는 경우에, 당신은이처럼 foreach($result as $field => $value){ 및 부품 아래에 뭔가 변화 시도 할 수 :이 원하는 효과의 경우

.. 
foreach($result as $person){ 
    foreach ($person AS $field => $value){ 
     $terms--; 
     $GLOBALS['queryStr'].= $field.' = '.$value; 
     if($terms){ 
      $GLOBALS['queryStr'].=' AND '; 
     } 
     echo $queryStr; 
    }   
} 
.. 

는 정교한하시기 바랍니다.

코드에 일부 추가 의견 :

당신은 이미 PDO 라이브러리 및 쿼리의 효율적이고 안전한 사용을위한 prepare 방법을 사용하고 있습니다. 매개 변수 바인딩을 사용할 때 PDO가이를 처리하므로 수신 된 데이터를 수동으로 위생 처리 할 필요가 없습니다. 여기이 선에 대해 이야기 :

$name = mysql_real_escape_string($_POST['name']); 

이 한 것은 :

$stmt->execute(array($name)) 

당신은 대신

$stmt->execute(array($_POST['name'])) 

에 일부를 실행 변경할 수 있습니다. 또한 PDO를 사용할 때 결과가 리턴되는지 정기적으로 확인하는 방법은 실행중인 명령문의 rowCount() 메소드입니다. PDO는 쿼리 결과 집합에 일치 항목이없는 경우에도 true을 반환합니다. 당신은 데이터베이스 연결에 할당 된 추가 자원을 피하는합니다 ($_POST['name']가 설정되어있는 경우 먼저 확인하는) 위의 리팩토링으로

.. 

if(isset($_POST['name'])){ 
    try{ 
     $dbh = new PDO('mysql:host=localhost;dbname=my_db', $user, $pass, array(PDO::ATTR_PERSISTENT=>true)); 

     $stmt = $dbh->prepare("SELECT * FROM persons WHERE FirstName LIKE ?"); 
     $stmt->execute(array($_POST['name'])); 
     $resultsSize = $stmt->rowCount(); 
     if($resultsSize > 0){ 
      $queryStr = ''; 

      $result = $stmt->fetchAll(); 
      foreach($result as $person){ 
       $terms = sizeof(array_keys($person));  
       foreach ($person AS $field => $value){ 
        $terms--; 
        $queryStr .= $field.' = '.$value; 
        if($terms){ 
         $queryStr .=' AND '; 
        } 
       $queryStr .= '<br/>'; // easier HTML visual evaluation 
       }   
      } 
      echo $queryStr; 
     } 

    }catch(PDOException $e){ 
     echo $e->getMessage(); 
    } 
} 

: 모든 결합 위의, 당신은 다음과 같이 코드의 일부있을 것입니다 (비록 당신이 그것을 사용하지 않더라도). 이 경우 다른 연결 코드와 함께 연결 초기화를 수행하는 것은 문제가되지 않습니다.이 경우에는 유사한 오류가 발생하여 데이터베이스 처리에 문제가 발생할 수 있습니다.

쿼리에 대한 변경 사항 : 문자열 값을 비교할 때 등호 (=)는 정확한 값을 바이트 단위로 비교하지만 LIKE 연산자는 인코딩의 복잡성을 놓치지 않는 이점을 제공합니다 - LIKE를 사용하면 일반적으로 허용되는 문자열 값 비교 방법입니다 (또한 LIKE를 사용하면 와일드 카드 (% 문자 등)를 사용할 수 있습니다).

** 편집 :

나는 당신의 의견에 따라 위의 코드를 업데이트 한 - 나는 또한 외부 foreach 루프 후 문자열의 출력을 이동 한 (그래서의 경우 모든 인쇄됩니다 반환 된 행이 처리되었습니다). 변수를 $GLOBALS 로컬 변수에서 로컬 변수로 변경했습니다 (현재 컨텍스트는이 파일 또는 페이지 생성 외부에서 액세스해야 할 필요가 있음을 의미하지는 않습니다. 그렇다면 $ _SESSION 변수 사용 가능성을 조사하십시오).

+0

안녕하세요, 제 코드를 변경했습니다. 원래 코드 영역에 있습니다. "echo $ queryStr"은 foreach 브래킷 너머에 있습니다. 왜냐하면 내가 할 목표는 이름, 성 및 나이 값을 표시하기 위해 쉽게 파싱 할 수있는 결과 라인이기 때문입니다. 나는 거의 결과를 얻지 못했지만, 여전히 결과는 조금은 아쉽다. 현재 결과를 표시하기 위해 내 메인 포스트를 편집했습니다. 나는 우리가 거의 그것을 깨뜨 렸을 것이라고 생각한다. 조금 더 "정리가 필요하다". – user3918443

+0

당신의 코멘트에 기초한 코드를 약간 수정했다. 편집을 확인한다. – Gabor