2010-08-16 89 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 ...

第一個函數調用是:

$ MR = AVG(查詢($屬性, '硫醇', $ 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 2010-08-16 18:22:22

+0

我不關注... – JKB 2010-08-16 18:24:02

+0

只是一個笑話。對不起,沒有你的答案,但。 – Smandoli 2010-08-16 18:24:44

回答

0

哦,我的代碼是一團糟。沒有什麼不能解決的。

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

,如果你有兩件事情在字符串中,像foo, bar這將失敗,並會完全抹殺你的括號內的條款,如果你路過那些英寸

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

表在FROM子句使用與正常數據不同的引用規則。不要通過字符串轉義運行它。

您可能要考慮切換到提供prepared statements & placeholders的數據庫訪問層like PDO

if($orderBySampIDAsc=='true') 

PHP有真正的布爾值。你不應該試圖將一個布爾狀態表示爲一個字符串。

現在,所有這一切說,我不明白你寫的query函數可以創建你在問題頂部提供的SQL!在致電mysql_query之前,您可以在功能的底部扔出print $query,看看實際產生了什麼?然後你可以複製&將它粘貼到phpmyadmin中,看看它真的最終會變成理智/瘋狂。

+0

它會對括號做什麼?如果按上述方式調用,它最多可以處理4個屬性,這就是爲什麼我很好奇。 我不知道我應該逃避表名。謝謝你的提示。 至於布爾的事情,這是一個新手的錯誤而回,我必須錯過了。我會確保修補它。 我做的回聲$查詢在函數的底部,除了我已經省略了一些屬性「...」這是我從PHP回結果。我也複製到MySQL查詢瀏覽器,它工作得很好。 – JKB 2010-08-16 19:26:22

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