SQL-запрос вызывает пустую страницу - PullRequest
1 голос
/ 10 марта 2009

Я создаю веб-сайт с использованием php, и у меня возникают проблемы с запросом SQL.

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

Это код, каким он и должен быть, однако он приводит к тому, что страница становится пустой (то есть просто отображается все белое). Я дважды проверил, и web_id определенно правильное имя и правильный регистр.

Если я изменю web_id в запросе, например, на «foo» (в основном на что-либо, кроме web_id), то страница отобразится, но с сообщением об ошибке «Неизвестный столбец« foo »in» где пункт "".

Кто-нибудь знает, что может быть причиной этого? Вот код, где я создаю тест таблицы:

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

Обновление

Основываясь на некоторых ответах здесь, я удалил кавычки из приблизительно $ websiteID и вывел ошибки, используя

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

В нем отображалось много ошибок, включая синтаксическую ошибку, ранее исправленную. Тем не менее, многие ошибки остаются, и они не имеют большого смысла для меня. Вот полный код моего метода:

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

Все ошибки, которые я получаю, такие -

Примечание: неопределенная переменная: вывод в /home/daniel/web/resultsTest.php в строке 113 "

Это повторяется несколько раз для url, exp, output, endUrlStart, endUrlEnd, dataSource, dataSourceName, post, image и print. Строка 113 - это большая возвращаемая строка.

Дело в том, что, насколько я могу судить, эти переменные определены, и я знаю, что таблица не пуста, потому что я могу отобразить ее на другой странице.

решаемые

Сортировка. Проблема была на самом деле в другой части моего кода - я неправильно вызывал getOutputSQL, но я исправил это сейчас!

Ответы [ 4 ]

2 голосов
/ 10 марта 2009

Я ожидаю, что ваш реальный код на самом деле ничего не ставит. Если это весь код, который у вас есть, он ничего не выводит, так как вы не выводите, когда нет ошибки (никакие эхо или распечатки не являются шаблонами или чем-то еще)

Также убедитесь, что вы установили и error_reporting, и display_errors. Вы можете сделать это в верхней части вашего скрипта, используя

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

Таким образом, вы увидите все ошибки.

EDIT
PHP имеет несколько типов ошибок, включая фатальные ошибки, предупреждения и уведомления. Уведомления говорят вам, когда вы используете неопределенные переменные или устаревшие функции, вы можете в значительной степени игнорировать их. Вы можете изменить настройки, чтобы не видеть их, используя:

error_reporting(E_ALL ^ E_NOTICE);

Тогда вы увидите только реальные ошибки (предупреждения и фатальные ошибки).

Подробнее Редактировать
Тогда эти переменные действительно не установлены, попробуйте что-то вроде этого перед вызовом getOutput ():

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

и посмотрите, действительно ли установлены переменные.

1 голос
/ 10 марта 2009

Попробуйте вместо этого:

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

Обратите внимание, что я удалил '' вокруг переменной websiteID. Это означает, что mysql будет воспринимать его не как строку, а как int, что вы и указали при создании таблицы mysql. Я также проверяю, является ли идентификатор веб-сайта номером. Если это не так, то нет смысла выполнять SQL-запрос, так как вы получите ноль результатов. Это защищает от инъекций sql.

1 голос
/ 10 марта 2009

Как правило, пустая страница в php означает отключенную уведомления об ошибках . Сначала вы должны включить их через .htaccess или php.ini.

Кстати: насколько я знаю, целые числа не должны заключаться в кавычки в SQL.

0 голосов
/ 10 марта 2009

Переменные, которые вы определяете внутри циклов, уничтожаются в конце цикла. Это означает, что выходная переменная, которую вы создаете в первом цикле while, не существует после цикла. Вы должны определить их вне цикла while, а затем установить значения внутри цикла:

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...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...