2009-03-09 5 views
1

Je crée un site Web utilisant php et j'ai des problèmes avec une requête SQL.Requête SQL entraînant l'effacement de la page

$dataArray = array(); 
$result = mysql_query("SELECT * FROM test WHERE web_id='$websiteID'") 
    or die(mysql_error()); 

while ($row = mysql_fetch_array($result)) { 
    $k = $row['kfoo']; 
    $v = $row['vbar']; 
    $dataArray[$k] = $v; 
} 

C'est le code tel qu'il devrait être, mais qui provoque la page d'aller vide (à savoir afficher simplement tout blanc). J'ai vérifié et web_id est certainement le nom correct et le bon cas.

Si je change web_id dans la requête pour être, par exemple, « foo » (essentiellement autre chose que web_id), la page affiche, mais avec le message d'erreur « Unknown column « foo » dans « où la clause » ".

Quelqu'un a-t-il une idée de ce qui pourrait être la cause? Voici le code où je crée le test de la table:

$dataDB = "CREATE TABLE test 
(
    data_id INT NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY(data_id), 
    web_id INT, 
    kfoo TEXT, 
    vbar TEXT 
)"; 

mysql_query($dataDB,$con); 

Mise à jour

Sur la base de quelques-unes des réponses ici, je l'ai enlevé les citations du monde websiteID $ et les erreurs affichées à l'aide

error_reporting(E_ALL); 
ini_set('display_errors', 1); 

Cela a affiché beaucoup d'erreurs, y compris une erreur de syntaxe plus tôt que je l'ai maintenant fixé. Cependant, beaucoup d'erreurs restent et elles n'ont pas beaucoup de sens pour moi. Voici le code complet pour ma méthode:

function getOutputSQL($websiteID,$userInput) { 
$result = mysql_query("SELECT * FROM websites WHERE websiteID=$websiteID") 
    or die(mysql_error()); 

    while ($row = mysql_fetch_array($result)){ 
    $url = $row['url']; 
    $exp = $row['exp']; 
    $output= $row['textPrint']; 
    $endUrlStart = $row['outUrlStart']; 
    $endUrlEnd = $row['outURLEnd']; 

    $image = $row['image']; 
    $print = $row['print']; 
    $post = $row['post']; 

    $dataSource = $row['dataSource']; 
    $dataSourceName = $row['dataSourceName'];   

    } 

    // construct array of data names and values 
    $dataArray = array(); 
    $result = mysql_query("SELECT * FROM test WHERE web_id=$websiteID") 
    or die(mysql_error()); 

    while ($row = mysql_fetch_array($result)) { 
    $k = $row['kfoo']; 
    $v = $row['vbar']; 
    $dataArray[$k] = $v; 
    } 

    // construct array of expressions and replacements 
    $result = mysql_query("SELECT * FROM regex WHERE web_id=$websiteID"); 
    $expArray = array(); 

    while ($row = mysql_fetch_array($result)) { 
    $e = $row['ex']; 
    $r = $row['re']; 
    $expArray[$e] = $r; 
    } 

    return getOutput($userInput,$url,$exp,$output,$endUrlStart, 
    $endUrlEnd,$dataSource,$dataSourceName,$post,$image,$print, 
    $expArray,$dataArray); 
} 

Les erreurs que je reçois sont tous comme ça -

Avis: Undefined variable: sortie en /home/daniel/web/resultsTest.php sur ligne 113"

qui se répète plusieurs fois pour url, exp, sortie, endUrlStart, endUrlEnd, dataSource, dataSourceName, poste, image et imprimer la ligne 113 est la grande ligne de retour.

La chose est, autant que je peux dire ces variables sont définies, et je sais que la table n'est pas vide, parce que je peux l'afficher sur une autre page.

Résolu

Classé. Le problème était en fait dans une autre partie de mon code - j'appelais getOutputSQL de manière incorrecte, mais je l'ai corrigé maintenant!

Répondre

2

En général, une page blanche en php indique que le numéro error notifications est désactivé. Au début, vous devriez les activer via .htaccess ou php.ini. BTW: Autant que je sache, les entiers ne devraient pas être cités en SQL.

+0

La citation d'entiers ne sera pas douloureuse. – Tomalak

2

Je m'attends à ce que votre code efface réellement n'importe quoi, Si tout le code que vous avez, il ne produit rien car vous n'avez pas d'erreur (pas d'écho ou d'impression sont des modèles ou quoi que ce soit)

Assurez-vous également de définir à la fois error_reporting et display_errors. Vous pouvez le faire à partir du haut de votre script en utilisant

error_reporting(E_ALL); 
ini_set('display_errors', 1); 

De cette façon uou'll voir toutes les erreurs.

EDIT
PHP dispose de plusieurs types d'erreurs, y compris les erreurs fatales, mises en garde et les avis. Les avis vous indiquent que lorsque vous utilisez des variables indéfinies ou des fonctions déconseillées, vous pouvez les ignorer. Vous pouvez modifier le réglage de sorte que vous ne verrez pas les utiliser:

error_reporting(E_ALL^E_NOTICE); 

Alors vous ne verrez que de véritables erreurs (avertissements et erreurs fatales).

Plus Modifier
Ensuite, ces variables sont vraiment unset, essayez quelque chose comme ça avant d'appeler getOutput():

echo "<pre>"; 
var_dump($userInput); 
var_dump($url); 
//etc. 
echo "</pre>"; 

et voir si les variables sont vraiment définies.

+0

Cela a exposé des tas d'erreurs, dont aucune n'a de sens pour moi. J'ai mis à jour la question avec les nouveaux problèmes. – Daniel

+0

Si je supprime les notifications comme vous le suggérez, je reçois simplement une page blanche. – Daniel

+0

Les variables ont été définies, mais j'ai trouvé le problème, c'était à voir avec comment j'appelais getOutputSQL. – Daniel

1

Essayez ceci:

$dataArray = array(); 
if(is_numeric($websiteID){ 
     $result = mysql_query("SELECT * FROM test WHERE web_id=$websiteID") or die(mysql_error()); 

     while ($row = mysql_fetch_array($result)) { 
       $k = $row['kfoo']; 
       $v = $row['vbar']; 
       $dataArray[$k] = $v; 
     } 
} 

avis J'ai enlevé le '' autour de la variable websiteID. Cela signifie que mysql ne le traitera pas comme une chaîne mais comme un int, ce qui est ce que vous avez spécifié dans la création de la table mysql. Je vérifie également si le numéro de site Web est un nombre. Si ce n'est pas le cas, il est inutile de faire la requête sql, car vous obtiendrez zéro résultat. Cela protège contre les injections sql.

0

Les variables que vous définissez à l'intérieur des boucles sont détruites à la fin de la boucle. Cela signifie que la variable de sortie que vous créez dans la première boucle while n'existe pas après la boucle. Vous devez les définir en dehors de la boucle while, puis définir les valeurs à l'intérieur de la boucle:

function getOutputSQL($websiteID,$userInput) { 
$result = mysql_query("SELECT * FROM websites WHERE websiteID=$websiteID") 
    or die(mysql_error()); 
    $url = ""; 
    $exp = ""; 
    $output = ""; 
    //... etc for all the other variables you need in the function at the end. 
    while ($row = mysql_fetch_array($result)){ 
    $url = $row['url']; 
    $exp = $row['exp']; 
    $output= $row['textPrint']; 
    $endUrlStart = $row['outUrlStart']; 
    $endUrlEnd = $row['outURLEnd']; 

    $image = $row['image']; 
    $print = $row['print']; 
    $post = $row['post']; 

    $dataSource = $row['dataSource']; 
    $dataSourceName = $row['dataSourceName'];     

    } 
    // the rest of your function... 
+0

J'ai essayé ceci et la page est encore vide. Il se passe quelque chose d'étrange. – Daniel