2014-06-10 3 views
2

사용자의 즐겨 찾기를 모두 favourites에서 가져와야하는 코드가 있습니다. 그런 다음이 정보를 사용하여 menus에서 해당 정보를 그림으로 표시해야합니다.PHP SQL While 루프가 작동하지 않습니다.

사용자의 즐겨 찾기를 표시하는 것만으로 즐겨 찾기에 많은 사진이 표시됩니다.

<?php 
$con=mysqli_connect("localhost","UN","PW","DB"); 

// Check connection 
if (mysqli_connect_errno()) { 
    echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
} 
$id=$_SESSION['user']['id']; 
$result = mysqli_query($con,"SELECT * FROM favourites WHERE user='$id'"); 

while($row = mysqli_fetch_array($result)) { 
    $code=$row['gamecode']; 
    $con=mysqli_connect("localhost","UN","PW","DB"); 
    // Check connection 
    if (mysqli_connect_errno()) { 
     echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
    } 

    $result = mysqli_query($con,"SELECT * FROM menus WHERE code='$code'"); 

    while($row = mysqli_fetch_array($result)) { 
?> 
<a href="<?php echo $row['link']; ?>"> 
<img src="<?php echo $row['picture']; ?>" alt="<?php echo $row['game']; ?>"  height="120" width="150" class="fade"></a> 
<?php 
    } 
    mysqli_close($con); 
} 

mysqli_close($con); 

?> 
+1

왜 루프에 여러 번 데이터베이스에 연결하고 있습니까? – barell

+0

두 데이터베이스가 있습니다. – Chikn

+1

왜 같은 변수를 사용하고 있습니까? – MorKadosh

답변

4

당신은 당신의 루프

$con = mysqli_connect(...) // connection #1 
$result = mysqli_query(...); 
while($row = mysqli_fetch($result)) { 
    $con = mysqli_connect(...); // connection #2 

다시 연결 내부의 DB에 다시 연결하여 쿼리를 죽이고있어, 당신은 당신의 쿼리를 죽이고 원래 연결을 죽인다.

다른 자격 증명으로 두 번 연결해야하는 경우가 아니면 두 번째 연결이 필요하지 않습니다. 하나의 단일 연결로 여러 쿼리를 처리 할 수 ​​있습니다.

덧붙여 말하면, 다른 연결 핸들 변수를 사용했다면

$con = mysqli_connect(...); 
    $othercon = mysqli_connect(...); 

당신은 문제가 없었을 것입니다. 여러 개의 연결을 가질 수 있지만 동일한 단일 변수를 사용하지는 마십시오.

+0

얻으려는 데이터가 들어있는 두 개의 데이터베이스가 있습니다. 그래서 두 개의 연결이 있습니다. – Chikn

+1

필요가 없습니다. 당신은'select db.table.field'를 아주 쉽게 할 수 있습니다. 하나의 사용자 계정에 두 데이터베이스 모두에 대한 액세스 권한을 부여하면됩니다. –

+0

글쎄, 두 번째 연결에 다른 변수 이름을 사용해야 할 것이다.'result'와'row'를 다시 사용할 수 없다. – MorKadosh

0

다른 결과 변수와 하나의 DB 연결을 사용하여 작동하는지 확인하십시오.

<?php 
$con=mysqli_connect("localhost","UN","PW","DB"); 
// Check connection 
if (mysqli_connect_errno()) { echo "Failed to connect to MySQL: " . mysqli_connect_error(); } 
$id = $_SESSION['user']['id']; 
$result1 = mysqli_query($con,"SELECT * FROM favourites WHERE user='$id'"); 
while($row = mysqli_fetch_array($result1)) { 
    $result2 = mysqli_query($con,"SELECT * FROM menus WHERE code='".$row['gamecode'].""); 
    while($row2 = mysqli_fetch_array($result2)) { ?> 
<a href="<?php echo $row2['link']; ?>"> 
<img src="<?php echo $row2['picture']; ?>" alt="<?php echo $row2['game']; ?>"  height="120" width="150" class="fade"></a> 
<?php } 
} 
mysqli_close($con); 
?> 
1

당신은 두 개의 MySQL의 $con의 같은 변수 이름의 연결뿐만 아니라 $result & $row 있습니다. 그래서 내부 루프의 변수 이름을 변경하여 충돌하지 않도록하십시오. & 모두 작동해야합니다. $con_inside, $result_inside & $row_inside.

또한 mysqli_query 행에 or die(mysqli_error());을 추가 했으므로 쿼리가 죽으면 오류가 반환 될 수 있습니다.

<?php 
$con = mysqli_connect("localhost","UN","PW","DB"); 

// Check connection 
if (mysqli_connect_errno()) { 
    echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
} 

$id = $_SESSION['user']['id']; 

$result = mysqli_query($con, "SELECT * FROM favourites WHERE user='$id'") or die(mysqli_error()); 

while ($row = mysqli_fetch_array($result)) { 

    $code = $row['gamecode']; 

    $con_inside = mysqli_connect("localhost","UN","PW","DB"); 

    // Check connection 
    if (mysqli_connect_errno()) { 
    echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
    } 

    $result_inside = mysqli_query($con_inside, "SELECT * FROM menus WHERE code='$code'") or die(mysqli_error()); 

    while($row_inside = mysqli_fetch_array($result_inside)) { 
?> 

    <a href="<?php echo $row_inside['link']; ?>"> 
    <img src="<?php echo $row_inside['picture']; ?>" alt="<?php echo $row_inside['game']; ?>" height="120" width="150" class="fade"></a> 

<?php 
    } 

    mysqli_close($con_inside); 

} 

mysqli_close($con); 

여기에 약간 개선 된 버전의 코드가 있습니다. 루프의 내부 DB 연결을 제거했습니다. & 스크립트 맨 위에 설정했습니다. 각 루프에서 연결을 재설정 할 필요는 없습니다. 또한 문자열을 설정하는 대신 mysqli_* 쿼리를 사용하는 기본 방법 인 mysqli_stmt_bind_param을 사용하여 줄을 추가했습니다. 또한 mysqli_free_result을 사용하여 각 루프에서 쿼리 메모리를 확보하십시오. 이들은 작은 것들이지만 더 나은 코드를 추가합니다.

<?php 

// Main DB connection. 
$con = mysqli_connect("localhost","UN","PW","DB") or die(mysqli_connect_error()); 

// Inside DB connection. 
$con_inside = mysqli_connect("localhost","UN","PW","DB") or die(mysqli_connect_error()); 

// Set the $id variable. 
$id = $_SESSION['user']['id']; 

// Set the query string. 
$query = "SELECT * FROM favourites WHERE user='$id'"; 

// Bind the values to the query. 
mysqli_stmt_bind_param($query, 's', $id); 

// Get the result. 
$result = mysqli_query($con, $query) or die(mysqli_error()); 

// Roll through the results. 
while ($row = mysqli_fetch_array($result)) { 

    // Set the $code variable. 
    $code = $row['gamecode']; 

    // Set the query string. 
    $query_inside = "SELECT * FROM menus WHERE code='$code'"; 

    // Bind the values to the query. 
    mysqli_stmt_bind_param($query_inside, 's', $code); 

    // Get the result. 
    $result_inside = mysqli_query($con_inside, $query_inside) or die(mysqli_error()); 

    // Roll through the results. 
    while($row_inside = mysqli_fetch_array($result_inside)) { 
?> 

    <a href="<?php echo $row_inside['link']; ?>"> 
    <img src="<?php echo $row_inside['picture']; ?>" alt="<?php echo $row_inside['game']; ?>" height="120" width="150" class="fade"></a> 

<?php 
    } 

    // Free the result set. 
    mysqli_free_result($result_inside); 

    // Close the connection. 
    mysqli_close($con_inside); 

} 

// Free the result set. 
mysqli_free_result($result); 

// Close the connection. 
mysqli_close($con); 
+0

답변을 주셔서 감사합니다.하지만 방금 시도한 것과 같은 일이 발생했습니다. – Chikn

+0

@Bob 그래, 지금 다시 해봐.또한'$ row' 변수 중 일부를'$ row_inside'로 변경하여 내부 연결 결과가 기본 연결 결과와 충돌하지 않도록했습니다. – JakeGould

+0

불행히도 여전히 동일합니다. – Chikn

관련 문제