2010-08-16 46 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