2010-08-16 6 views
2

J'ai une requête relativement longue comme suit:Limite de caractères de la requête 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 

Le problème est que la requête fonctionne parfaitement bien dans MySQL admin, mais PHP semble étouffer quand j'ajouter plus de 4 colonnes et donne moi un résultat nul. Des conseils? De plus, ai-je manqué un moyen simple de définir simplement la condition NOT NULL pour l'ensemble du paramètre SELECT plutôt que de le copier à nouveau?

EDIT: Comme demandé, le PHP qui appelle cette requête est la suivante ...

premier appel de fonction est:

$ mr = taux moyen (requête (propriété $, 'mercaptans', $ dates ['mostRec']), $ propriété);

Où requête et avg sont définis comme:

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); 
} 

Désolé, il est tellement espacé - je ne peux pas sembler obtenir formaté autrement. Quoi qu'il en soit, ce code fonctionne probablement dans une trentaine d'autres requêtes sur la page, mais échoue juste pour celui-ci.

+0

Ce sont les mercaptans! – Smandoli

+0

Je ne suis pas ... – JKB

+0

Simplement une blague. Désolé de ne pas avoir la réponse pour vous si. – Smandoli

Répondre

0

Oh mon Dieu, ce code est un gâchis. Rien qui ne puisse être réparé.

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

Cela échouera si vous avez deux choses dans la chaîne, comme foo, bar, et effacera complètement vos clauses parenthésées, si vous passez ceux.

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

tables dans la clause FROM utiliser différentes règles de cotation que les données normales. Ne l'exécutez pas à travers la chaîne qui s'échappe.

Vous souhaitez probablement envisager de passer à une couche d'accès à la base de données like PDO qui fournit prepared statements & placeholders.

if($orderBySampIDAsc=='true') 

PHP a de réels booléens. Vous ne devriez pas essayer de représenter un état booléen comme une chaîne. Maintenant, tout cela étant dit, Je ne vois pas comment la fonction query que vous avez écrite peut créer le SQL que vous avez fourni en haut de votre question! Pouvez-vous jeter dans un print $query au bas de la fonction, avant l'appel à mysql_query, et voir ce qui est réellement généré? Ensuite, vous pouvez copier & le coller dans phpmyadmin et voir à quel point il est vraiment sain d'esprit.

+0

Qu'est-ce que cela va faire exactement à mes parenthèses? Il fonctionne avec jusqu'à 4 propriétés lorsqu'il est appelé comme ci-dessus, ce qui explique pourquoi je suis curieux. Je n'étais pas au courant que je devrais échapper au nom de la table. Merci pour le conseil. Quant à la chose booléenne, c'était une erreur de débutant il y a quelque temps que j'ai dû manquer. Je ferai en sorte de corriger cela. J'ai fait une requête $ echo en bas de la fonction et à part quelques propriétés que j'ai omises avec '...' c'est le résultat que j'ai récupéré de PHP. Je l'ai également copié dans MySQL Query Browser et cela a très bien fonctionné. – JKB

0

Vous pouvez réécrire votre requête ci-dessus comme celui-ci en utilisant la AYANT mot-clé:

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 
Questions connexes