PHP / MySQL查询字符限制?

时间:2010-08-16 18:20:11

标签: 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管理员中运行得很好,但是当我添加4列以上并且给我一个NULL结果时,PHP似乎会扼杀它。有小费吗?另外,我是否遗漏了一些简单的方法来简单地为整个SELECT参数设置NOT NULL条件而不是将其再次复制出去?

编辑:根据要求,调用此查询的PHP如下...

第一个函数调用是:

  

$ mr = avg(查询($ property,'mercaptans',$ dates ['mostRec']),$ property);

其中query和avg定义为:

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个其他查询,但只是失败了。

2 个答案:

答案 0 :(得分:0)

哦,我的,那段代码很乱。什么都无法解决。

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

如果您在字符串中有两个内容(如foo, bar),则会失败,并且如果您将这些内容传递出去,则会完全删除您的括号中的内容。

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

FROM子句中的表使用不同的引用规则而不是普通数据。不要通过字符串转义来运行它。

您可能希望考虑切换到提供like PDO的数据库访问层prepared statements & placeholders

if($orderBySampIDAsc=='true')

PHP有真正的布尔值。您不应该尝试将布尔状态表示为字符串。

现在,所有这些,我看不出您编写的query函数如何创建您在问题顶部提供的SQL!在调用print $query之前,您可以在函数底部引入mysql_query,看看实际生成了什么?然后你可以复制&amp;将它粘贴到phpmyadmin中,看看它到底是多么神圣/疯狂。

答案 1 :(得分: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