2014-09-29 2 views
1

동적 인 PHP 웹 사이트를 만들고 있습니다. 여기에는 탐색을 비롯하여 사이트의 모든 항목이 동적으로 생성됩니다. 필자는 PHP를 처음 사용하면서 테스트 페이지 (test.php)를 만들었으며 페이지에 검색 양식이 있으면 여러 쿼리와 준비된 문을 수행 할 때 몇 가지 문제가 발생했습니다. 기본적으로 내가하고있는 일은 SQL에서 parent = 0 인 최상위 네비게이션 항목에 대한 쿼리를 작성하고 검색을 기반으로 다른 테이블의 항목을 검색하는 준비된 명령문입니다. 두 개의 쿼리는 관련이 없습니다. 내 몸에 네비게이션이 디스플레이되어있는 곳에서 최상위 메뉴 항목의 현재 ID와 같은 상위 항목이있는 탐색 항목을 검색하기 위해 다른 쿼리를 중첩시키고 싶습니다. 내 몸에서MySQLi가 관련이없는 여러 쿼리를 실행하고 준비된 문을 실행합니다.

try { 
    //db connection is here 

    $sql1 = 'SELECT * FROM menu_items WHERE item_parent = 0'; 
    $result1 = $db->query($sql1); 

    if (isset($_GET['search'])) { 
     $sqlSearch = "SELECT id, css_body, page_title, meta_description, meta_keywords, heading, details, layout 
      FROM content 
      WHERE (details LIKE ? OR heading LIKE ?)"; 
     $stmt = $db->stmt_init(); 
     if (!$stmt->prepare($sqlSearch)) { 
      $error = $stmt->error; 
     } else { 
     $var1 = '%' . $_GET['searchterm'] . '%'; 
     $stmt->bind_param('ss', $var1, $var1); 
     $stmt->execute(); 
     $stmt->bind_result($id, $css_body, $page_title, $meta_description, $meta_keywords, $heading, $details, $layout); 
    } 

    } 

} catch (Exception $e) { 
    $error = $e->getMessage(); 
} 

:이 내 문서의 상단에있는 SQL에있는 코드와

<ul> 
    <?php while ($row = $result1->fetch_assoc()) { ?> 
    <li><?php echo $row["item_title"]; ?> 

    <?php $sql2 = 'SELECT * FROM menu_items WHERE item_parent = ' . $row["item_id"]; 
     $result2 = $db->query($sql2); 
     if (isset($result2)) { ?> 

     <ul> 
     <?php while ($row2 = $result2->fetch_assoc()) { ?> 
     <li><?php echo $row2["item_title"]; ?></li> 
     <?php } ?> 
    </ul>  
     <?php } ?> 
    </li> 
    <?php } ?> 
    </ul> 

, 난 그냥 test.php 페이지로 바로 이동하는 경우, 검색을 수행하지 않고, 모든 것이 잘 표시됩니다. 예를 들어, 페이지의 모습 : 그때 같은 페이지에 제출 페이지에서 검색 양식을 (제출하는 경우에는

<ul> 
<li>Page 1</li> 
<ul> 
<li>Sub Page 1</li> 
<li>Sub Page 2</li> 
</ul> 
<li>Page 2</li> 
</ul> 

url은 test.php SEARCHTERM = 내 + 검색 & 검색과 같을 것이다 = Go) 그러면 오류가 발생합니다. 페이지에 첫 번째 LI가 표시되지만 두 번째 쿼리에 도달하면 완전히 멈 춥니 다. 그래서 같이 보인다 :

<ul> 
<li>Page 1</li> 

나는 준비된 성명에서 "하위 탐색"/ 중첩 된 쿼리가 잘 작동에 대한 모든 것을 제거합니다. menu_items에 대한 SQL/PHP를 제거하면 준비된 명령문이 정상적으로 작동합니다. 문제는 모든 것을 한 페이지에 넣을 때입니다. 누군가 내가 잘못하고있는 것을 설명 할 수 있다면, 크게 감사하겠습니다. 필자는 준비된 문장과 객체 지향 PHP를 처음 접했습니다. Lynda.com의 David Powers와 Object Oriented PHP를 사용하여 Accessing Databases를보고 난 후 위의 모든 것을 배웠습니다. 나는이 문제를 발견처럼

<?php 
try { 
    require_once '_includes/mysqli-connect.php'; 
    $sql1 = 'SELECT * FROM menu_items WHERE item_parent = 0'; 
    $result1 = $db->query($sql1); 

    if (isset($_GET['search'])) { 
     $sqlSearch = "SELECT heading, details FROM content WHERE (details LIKE ? OR heading LIKE ?)"; 
     $stmt = $db->stmt_init(); 
     if (!$stmt->prepare($sqlSearch)) { 
      $error = $stmt->error; 
     } else { 
      $var1 = '%' . $_GET['searchterm'] . '%'; 
      $stmt->bind_param('ss', $var1, $var1); 
      $stmt->execute(); 
      $stmt->bind_result($heading, $details); 
     } 
    } 
} catch (Exception $e) { 
    $error = $e->getMessage(); 
} 
?> 
<!doctype html> 
<html> 
<head> 
<meta charset="utf-8"> 
<title>Test</title> 
</head> 

<body> 
<?php if (isset($error)) { 
    echo "<p>$error</p>"; 
} 
?> 
<ul> 
    <?php while ($row = $result1->fetch_assoc()) { ?> 
    <li><?php echo $row["item_title"]; ?> 
    <?php 
    $sql2 = 'SELECT * FROM menu_items WHERE item_parent = ' .$row["item_id"]; 
    $result2 = $db->query($sql2); 
    if (isset($error)) { 
     echo "<p>$error</p>"; 
    } 
    if (isset($result2)) { ?> 
    <ul> 
     <?php while ($row2 = $result2->fetch_assoc()) { ?> 
     <li><?php echo $row2["item_title"]; ?></li> 
     <?php } ?> 
    </ul> 
    <?php } 
    ?> 
    </li> 
    <?php } ?> 
</ul> 

<!-- Search form and results below --> 
<form method="get" action="<?php echo $_SERVER['PHP_SELF']; ?>"> 
    <p> 
    <label for="searchterm">Enter a name or part of one:</label> 
    <input type="search" name="searchterm" id="searchterm"> <input type="submit" name="search" value="Go"></p> 
</form> 
<?php 
if (isset($error)) { 
    echo "<p>$error</p>"; 
} 
$stmt->store_result(); 
$numrows = $stmt->num_rows; 
if ($numrows) { 
    echo "<p>Total results found: ". $numrows; 
} else { 
    echo "No Results"; 
} 

while ($stmt->fetch()) { 
    echo "<p>Heading: " . $heading . "</p>";  
    echo $details; 
    echo "<hr/>"; 
} 
?> 
</body> 
</html> 
<?php 
$result1->free(); 
$stmt->free_result(); 
if (isset($db)) { 
    $db->close(); 
} ?> 
+1

당신이 끝내기 전에 오류가 있습니까? 필요할 때마다?> 또한 var1 선언을 bind-> param 문 위로 이동하십시오. – Jim

+0

여기에 코드를 편집 할 때 우연히>를 삭제해야합니다.하지만 실제 파일 코드에 있으므로 문제가되지 않습니다. 내가 제안했지만 문제가 남아있는 것처럼 var1 선언을 옮겼습니다. – user2762748

+0

당신의'if (isset ($ _ GET [ 'search'])) {}가 어디에도 닫혀 있지 않습니다. 코드를 함수로 분해하는 것을 고려해야합니다. 그것이 지금의 방식을 읽는 것은 꽤 어렵습니다. 또한 실제로 검색 입력을 기반으로 필터링을 수행하는 것처럼 보이지 않습니다. –

답변

0

가 보이는 :

여기에 전체 페이지 코드입니다. 기본적으로 문제는 MySQLi가 더 많은 결과가있을 것이라고 생각하며 검색 쿼리의 결과가 저장되거나 명령문이 닫힐 때까지 더 이상의 명령문이나 쿼리를 실행하지 않습니다. 하위 탐색 쿼리를 실행 한 후에야 나는 원래대로 작업을 수행하지 않았습니다. 이제이 줄의 코드를 $ stmt-> store_result(); 아래에서 $ stmt_bind_result ($ heading, $ details); 이제 모든 쿼리가 작동합니다.

$stmt->execute(); 
$stmt->bind_result($heading, $details); 
$stmt->store_result(); 
관련 문제