2012-01-06 2 views
1

저는 최근 Prepared Statements를 배우기 시작했으며 새로운 스타일로 스크립트를 구성하기 시작했습니다.동일한 페이지에 여러 개의 쿼리를 표시 할 수 없습니다.

그러나 나는 작은 벽을 만났고 누군가 올바른 방향으로 나를 가리킬 수 있기를 바랍니다. 여기

내 SQL 쿼리 구조 :

$query = "SELECT `results`, `Success`, `Failure`, `Counter`, `Grades`, `Classes`, 
`Special_Id`, `SpecialCondition` FROM `Courses` INNER JOIN `Students` ON `id` = 
`Students_Id` JOIN `Conditions` ON `id` = `Special_Id`"; 

$stmt = $Mconn->prepare($query); 
$stmt->bind_result($results, $success, $failed, $counter, $grades, $classes, 
$specialId, $specialcondition); 
$stmt->execute(); 
$stmt->store_result(); 

그리고 여기에 하나 개의 코드 블록 :

<?php 

echo "<select = \"SpecialConditions\">"; 
if($stmt->num_rows == NULL){ 
    echo "No results found."; 
}else{ 
    while($stmt->fetch()){ 

    echo "<option value=\"$specialId\">$specialcondition</option>"; 
} 
} 
echo "</select>"; 
?> 

그리고 다른 코드 블록 :

<?php 
echo "<select = \"Grades\">"; 
if($stmt->num_rows == NULL){ 
    echo "No results found."; 
}else{ 
    while($stmt->fetch()){ 

     echo "<option value=\"".$grades."\">".$grades."</option>"; 
    } 
} 
echo "</select>"; 

?> 

좋아, 지금 일어나고있는 일입니다 두 페이지를 같은 페이지에 배치하면 첫 번째 블록은 두 번째 쿼리와 그 아래에있는 다른 쿼리를 죽이게됩니다. 나는 이유를 알 수 없으며 이것을 끝까지 연구했습니다.

같은 코드 블록 내에서 연결을 닫으려고 시도했지만 트릭을 할 수는 없을 것이라고 생각합니다.

이제는 DB 연결이 작동하고 있고, 별도의 페이지에서 각 블록을 테스트하면 예상 한대로 작동하기 때문에 실제로 결과가 저장된다는 것을 알고 있습니다.

도움을 주셔서 감사합니다. 당신이 그들을

$stmt->close(); 

다른 하나는 모든 데이터를 가져온 경우에도, 여전히 뛰어난있는 동안 다른 준비된 명령문을 시작할 수 없습니다 완료하면

답변

1

니스, 나는 마침내 작동하도록했습니다. 모든 것을 배열에 저장하고 추출해야합니다. 적어도 그것이 제대로 작동하도록하는 유일한 방법입니다.

다음은이 벽을 궁금해하거나 장래에 다룰 사람을위한 최종 해결책입니다. 이 방법이 필요하지 않은 방법을 알고 있다면 알려주십시오. 연결하고 데이터베이스를 쿼리

내 동적 기능 : 여기

<?php 

function DB_Query(){ 
$databasefields = array(); 
$results = array(); 

@$Mconn = new mysqli(DBHOST, DBUSER, DBPWRD, DBNAME); 

    if ([email protected]_connect(DBHOST, DBUSER, DBPWRD, DBNAME)){ 
    die(DBERROR); 
    } 

$query = "SELECT `results`, `Success`, `Failure`, `Counter`, `Grades`, `Classes`, 
`Special_Id`, `SpecialCondition` FROM `Courses` INNER JOIN `Students` ON `id` = 
`Students_Id` JOIN `Conditions` ON `id` = `Special_Id`"; 

$stmt = $Mconn->prepare($query); 
$stmt->execute(); 
$meta = $stmt->result_metadata(); 

while($field = $meta->fetch_field()){ 
$databasefields[] = &$row[$field->name]; 
} 

call_user_func_array(array($stmt, 'bind_result'), $databasefields); 
while($stmt->fetch()){ 
    $queried = array(); 
    foreach($row as $key => $vector){ 
     $queried[$key] = $vector; 
    } 

    $results[] = $queried; 
} 

return $results; 
} 

$results = DB_Query(); // placed in DB include file 
?> 

을 그리고 내가 실제로에 사용 단독으로 또는 여러 블록에 데이터를 표시하는 코드입니다. 필드 이름을 자신의 것과 일치하도록 변경하십시오. 이 함수는 동적이며 바인딩 결과를 하드 코딩 할 필요가 없으므로 원하는만큼 필드를 가져올 수 있습니다.

<?php 
foreach($results as $row){ 
echo $row['grades'].'<br />'; 
} 

모든 도움을 주셔서 감사합니다 나는 이것이 내가했던 것과 같은 문제로 실행하는 사람들을 도울하는 역할을하겠습니다.

+0

축하합니다. 가능하면 왼쪽의 체크 표시를 사용하여 대답을 '수락 함'으로 표시하십시오. 이것은 다른 사람들이 귀하의 문제가 해결되었음을 알리게합니다. 환호 ~ –

+0

감사합니다. – Cryotech

4

당신은 close the statements에 있습니다.

+0

안녕하세요. Marc, 내가 제안한 것을 시도했지만 동일한 페이지에 둘 이상의 검색어를 표시 할 수 없습니다. 그래서 두 블록에 넣으려고했지만 $ stmt-> close(); 두 블록 모두 다음과 같은 오류가 발생했습니다 : 경고 : mysqli_stmt :: close() [mysqli-stmt.close] : mysqli_stmt를 가져올 수 없습니다. – Cryotech

+0

가져 오기 루프에서 -> close() 호출을 수행 했습니까? 가져 오기 루프가 완료되고 검색을 마친 후에 만해야합니다. –

+0

안녕하세요 마크, 아니요. 태그 바로 다음에 두었습니다. 두 번째 태그 사이에 놓으려고했습니다.} 최종 태그 바로 앞에 아무 것도 작동하지 않는 것 같습니다. 나는 결과가 긍정적이라는 것을 안다, 나는 단지 그들이 어떤 이유로 표시되도록 할 수 없다. – Cryotech

관련 문제