2016-10-12 3 views
0

여기 내가하고있는 일이 있습니다.MySQL 쿼리가 무엇을 반환하는지 확인하는 데 문제가 있음

  1. $ get_version이있는 URL에 '버전'값이 있는지 확인하고 있습니다.
  2. 데이터베이스에서 최신 버전을 가져 와서 기본 변수로 설정하십시오.
  3. URL 변수가 좋은 경우 데이터베이스가 있는지 확인한 다음 적절한 변수를 설정하십시오.
  4. 존재하지 않는 경우 위의 기본값을 사용하십시오.

항상 "잘못된 쿼리 섹션"으로 이동합니다. 내 쿼리가 잘못되었거나 if 문이 작동하지 않습니다.

여기 내 코드가 있습니다. 또한, 그것을하는 더 깨끗한 방법이 있습니까?

// Check if there's a version in URL. If not, set to empty. 
$get_version = isset($_GET['version']) ? $_GET['version'] : ''; 


    // Set defaults if nothing in URL 
    $query = "SELECT * FROM sn_hockey_versions ORDER BY version_id DESC LIMIT 1"; 
    mysqli_query($db, $query) or die('Error querying database.'); 
    $result = mysqli_query($db, $query); 

    while ($row = mysqli_fetch_array($result)) { 
     $newest_version_id = $row['version_id']; 
     $newest_sections = $row['sections']; 
    } 

    if (!empty($get_version) && preg_match('/^[0-9.]*$/', $get_version)) { 

     $query = "SELECT version_id, sections FROM sn_hockey_versions WHERE version = '".$get_version."'"; 
     mysqli_query($db, $query) or die('Error querying database.'); 
     $result = mysqli_query($db, $query); 


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

      $set_version = $row['version_id']; 
      $v_sections = $row['sections']; 
      $test = "IT WORKS!!!!"; 

     } 
     else { 
      $set_version = $newest_version_id; 
      $v_sections = $newest_sections; 
      $test = "Bad query"; 
     } 
    } 
    else { 
     $set_version = $newest_version_id; 
     $v_sections = $newest_sections; 
     $test = "Set default"; 
    } 
+0

mysql 함수는 실패시 부울 false를 반환합니다. 당신은 그걸 확인하는 것을 결코 신경 쓰지 않습니다. 그리고 어떤 행과도 매치/변경하지 않는'select' 또는'update' 쿼리는 실패가 아니라는 것에주의하십시오. 그것은 아무 것도 성취하지 못한 성공적인 질의입니다. –

답변

0

조건부 if 문은 결과가 반환되었는지 여부가 아닌 $ rows가 mysql_fetch_array ($ result)로 설정되어 있는지 확인합니다. 쿼리에서 결과를 반환하면 조건문은 true를 반환하고 $ row는 결과 배열에 설정되며 if 블록은 평가됩니다. 그렇지 않으면, $ row는 null로 설정되어 조건은 false가되고 else 블록은 평가됩니다.

else 문이 평가 중이므로 배열의 결과를 인쇄하여 테스트 할 수있는 쿼리에 문제가 있다고 생각합니다. 결과를 가져 오는 전에 더 나은 해결책이 될 것 mysql_num_rows도의 값을 확인하는 쿼리 코드에서 혼란을 방지하기 위해, 어떤 결과를 반환 여부를 확인하기 위해 여러 가지 방법이 있지만 : mysqli_num_rows에 대한 자세한 내용은

if (mysqli_num_rows($result) > 0) { 
     $row = mysqli_fetch_array($result) 

확인

http://php.net/manual/en/mysqli-result.num-rows.php 또한 참조 : Whats the proper way to check if mysql_query() returned any results?

인 코드를보다 효율적으로 만들기위한 내가 가진 다른 추천 : 필요한 경우에만 기본 버전에 대한 데이터베이스를 쿼리합니다. 불필요한 쿼리가 너무 많으면 데이터베이스 성능 문제가 발생할 수 있습니다. 이를 수행하는 한 가지 방법은 기본 버전 쿼리를 함수에 배치하고 "잘못된 쿼리" "기본 설정"블록에서만 호출하는 것입니다. 이게 도움이 되길 바란다.

+0

데이터를 가져와야한다면 ** 아무것도 ** 신뢰할 수 있습니다. num_rows는 단지 쓸데없는 추가 호출을 추가하고 아무 것도 –

+1

OP가 쿼리가 아무 것도 반환하지 않았는지 확인하는 방법을 묻지 않습니다. mysqli_num_rows는 정확히 그가 원하는 것이고 거의 쓸모가 없다. 결과가 있으면 결과를 검색 할 수 있습니다.나는 OP의 마지막 문장에서 요구 된 바와 같이 효율성 향상을위한 권장 사항을 추가했다. –

+0

쓸데없는 추가 호출없이 결과를 검색 할 수 있습니다. 추가 코드 **를 제공하기 전에 현재 접근법이 신뢰할 수 없거나 잘못 된 이유를 설명해야합니다. ** –

0

코드 외부에서 성공했는지 확인하려면 쿼리를 복사하여 phpmyadmin 또는 ssh를 통해 실행하여 결과가 반환되는지 확인하십시오. 결과가 반환되면 코드에서 일부 중지 확인을 입력하여 현재 결과를 확인하십시오. like so

echo '<pre>jwow',print_r($result,1),'</pre>'; 
die('here'); 

결과를 확인하고 싶은 부분을 입력하십시오. 다른 이름으로 쿼리 결과의 이름을 지정하고 싶습니다. $ defaults_results 및 $ version_results와 같습니다. 그것이 "나쁜 쿼리"에 도달하면 시도한 후에 오류를 발견하게 될 것입니다. phpmyadmin에서 결과를 반환하지 않으면 phpmyadmin에서 결과를 읽습니다.

관련 문제