동적 인 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();
} ?>
당신이 끝내기 전에 오류가 있습니까? 필요할 때마다?> 또한 var1 선언을 bind-> param 문 위로 이동하십시오. – Jim
여기에 코드를 편집 할 때 우연히>를 삭제해야합니다.하지만 실제 파일 코드에 있으므로 문제가되지 않습니다. 내가 제안했지만 문제가 남아있는 것처럼 var1 선언을 옮겼습니다. – user2762748
당신의'if (isset ($ _ GET [ 'search'])) {}가 어디에도 닫혀 있지 않습니다. 코드를 함수로 분해하는 것을 고려해야합니다. 그것이 지금의 방식을 읽는 것은 꽤 어렵습니다. 또한 실제로 검색 입력을 기반으로 필터링을 수행하는 것처럼 보이지 않습니다. –