2010-08-16 5 views
2

그래서 나는 비교적 긴 쿼리를 가지고 :PHP/MySQL 쿼리 문자 제한? 다음과 같이

SELECT (
    (CASE Methanethiol 
     WHEN -1 THEN 0 
     ELSE Methanethiol 
    END) 
    + 
    ... 
    + 
    (CASE nHeptanethiol 
     WHEN -1 THEN 0 
     ELSE nHeptanethiol 
    END) 
) 
FROM condensates.mercaptans 
WHERE (
    (CASE Methanethiol 
     WHEN -1 THEN 0 
     ELSE Methanethiol 
    END) 
    + 
    ... 
    + 
    (CASE nHeptanethiol 
     WHEN -1 THEN 0 
     ELSE nHeptanethiol 
    END) 
) IS NOT NULL 

문제는 쿼리는 MySQL의 관리자에 완벽하게 잘 작동하지만 PHP는 좀 더 후 4 열을 추가 할 때에 질식 보인다 준다이다 나 NULL 결과. 어떤 팁? 또한 간단히 전체 SELECT 매개 변수에 대해 NOT NULL 조건을 설정하는 쉬운 방법이 없기 때문에 다시 복사하지 마십시오.

편집 : 요청으로, 다음과 같이이 쿼리는 호출하는 PHP ...

먼저 함수 호출은 다음과 같습니다

$ 씨 = 평균 (쿼리 ($ 속성, '메르 캅탄' $ dates [ 'mostRec']), $ property); 쿼리 및 평균은 다음과 같이 정의된다

:

function avg($query, $colName){ 
    $iter=0; 
    $sum=0; 
    while($row = mysql_fetch_array($query)) { 
     if($row[0]!==NULL){ 
      $iter++; 
      $sum += ($row[$colName]==-1) ? 0 : $row[$colName]; 
     } 
    } 
    mysql_free_result($query); 

    if ($iter==0) 
     return '-'; 
    else { 
     $avg = ($sum/$iter); 
     if(lessThanMDL($avg, $colName)) 
      return 'ND'; 
     else 
      return $avg; 
    } 
} 

function query($selectWhat, $fromTable, $sampleIDs,$orderBySampIDAsc='false'){ 
    $query = "SELECT "; 
    $query .= mysql_real_escape_string($selectWhat); 
    $query .= " FROM "; 
    $query .= mysql_real_escape_string($fromTable); 
    if(count($sampleIDs) >= 1) { 
     $query .= " WHERE ("; 
     $iter=0; 
     while($iter < count($sampleIDs)-1){ 
      $query .= "(SampleID=" . >mysql_real_escape_string($sampleIDs[$iter]) . ") OR "; 
      $iter++; 
     } 

     $query .= "(SampleID=" . >mysql_real_escape_string($sampleIDs[$iter]) . "))"; 
     $query .= " AND " . mysql_real_escape_string($selectWhat) . " IS NOT NULL"; 
    } else { 
     $query .= " WHERE SampleID=0"; # always returns nothing 
    } 

    if($orderBySampIDAsc=='true') 
     $query .= " ORDER BY SampleID ASC"; 

    global $condensatesdb; 
    return mysql_query($query, $condensatesdb); 
} 

죄송 그렇게 밖으로 간격있어 - 내가 그렇지 않으면 포맷 얻을 수없는 것. 어쨌든,이 코드는 아마 페이지에서 30 개의 다른 쿼리와 유사하지만이 태그는 실패합니다.

+0

그것은 메르 캅탄이입니다! – Smandoli

+0

나는 따르지 않는다 ... – JKB

+0

단지 농담. 죄송하지만 당신을 위해 대답을하지 못했습니다. – Smandoli

답변

0

오, 내 코드는 엉망입니다. 고칠 수없는 것은 없습니다.

$query = "SELECT "; 
$query .= mysql_real_escape_string($selectWhat); 

이것은 당신이 foo, bar처럼 문자열에 두 가지가있는 경우 실패하고 당신이 그 전달하는 경우 완전히 당신의 괄호 절을 쓸어 버릴 것이다. FROM 절에서

$query .= " FROM "; 
$query .= mysql_real_escape_string($fromTable); 

테이블 다른 인용 규칙을 사용하십시오. 정상적인 데이터보다. 문자열 이스케이프를 통해 실행하지 마십시오.

prepared statements & placeholders을 제공하는 데이터베이스 액세스 계층 like PDO으로 전환하는 것이 좋습니다.

if($orderBySampIDAsc=='true') 

PHP에는 실제 부울이 있습니다. 부울 상태를 문자열로 나타내려고해서는 안됩니다.

이제 모든이 말은 당신이 작성한 함수 query이 질문의 맨 위에 제공 한 SQL을 어떻게 만들 수 있는지 보지 못했습니다!mysql_query을 호출하기 전에 함수 하단에 print $query을 던져서 실제로 생성되는 내용을 볼 수 있습니까? 그런 다음 &을 phpmyadmin에 붙여 넣고 실제로 제정신이 아님을 볼 수 있습니다.

+0

내 괄호에는 정확히 무엇이 해당됩니까? 위와 같이 호출 할 때 최대 4 개의 속성을 사용할 수 있으므로 궁금합니다. 나는 테이블 이름을 벗어나는 것을 모르고있었습니다. 팁 고마워. 부울 것은 내가 놓쳐 버린 것 같은 신참 실수였습니다. 나는 그것을 확증 할 것입니다. 함수의 맨 아래에 echo $ 쿼리를했는데 '...'을 생략 한 일부 속성을 제외하고 PHP에서 얻은 결과입니다. 나는 또한 그것을 MySQL Query Browser에 복사 했으므로 제대로 작동했다. – JKB

0

당신은 HAVING 키워드를 사용하여이처럼 위의 쿼리를 다시 작성할 수 있습니다 :

SELECT 
    (CASE Methanethiol 
     WHEN -1 THEN 0 
     ELSE Methanethiol 
    END) 
    + 
    ... 
    + 
    (CASE nHeptanethiol 
     WHEN -1 THEN 0 
     ELSE nHeptanethiol 
    END) 
AS matches 
FROM condensates.mercaptans 
HAVING matches > 0