Проблема с $ _POST, если isset () и mysql_fetch_assoc (): echo возвращает правильное значение, источник страницы всегда возвращает значение else

Этот вопрос начался как другой поток, но после многого поиска и сужения проблемы он значительно изменился и, как таковой, я подумал, что может возникнуть вопрос о том, чтобы начать новый вопрос со ссылкой на старый:

Переменная конкатенированная строка запроса mysql отлично работает в phpMyAdmin, но не PHP в скрипте

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

Кажется, что я верю в проблему. У меня простая форма:

<head> </head> <body> <form method = "post" name = "testform" action = "testgenxml.php" > <input type = "checkbox" name = "GFCheckbox"> <input type = "submit" value="Submit"> </form> </body> </html> 

Затем у меня есть функция PHP, которая проверяет, выбран ли GFCheckbox. Если это определенная строка передается в значение $ query. Если это не другая строка, передается значение $ query. Вот функция PHP.

 <?php function parseToXML($htmlStr) { $xmlStr=str_replace('<','&lt;',$htmlStr); $xmlStr=str_replace('>','&gt;',$xmlStr); $xmlStr=str_replace('"','&quot;',$xmlStr); $xmlStr=str_replace("'",''',$xmlStr); $xmlStr=str_replace("&",'&amp;',$xmlStr); return $xmlStr; } $query = ""; if (isset($_POST['GFCheckbox'])) { $query = 'SELECT * FROM fdatav1 f INNER JOIN ddatav1 d USING(ID) WHERE (GFOption = "1")'; } else { $query = 'SELECT * FROM fdatav1 f INNER JOIN ddatav1 d USING(ID)'; } $connection = mysql_connect(localhost, $username, $password); if (!$connection) { die('Not connected : ' . mysql_error()); } $db_selected = mysql_select_db($database, $connection); if (!$db_selected) { die ('Can\'t use db : ' . mysql_error()); } $result = mysql_query($query); if (!$result) { die('Invalid query: ' . mysql_error()); } while ($row = @mysql_fetch_assoc($result)){ echo 'accname="' . parseToXML($row['accname']) . '" '; echo 'description="' . parseToXML($row['description']) . '" '; echo 'venue="' . parseToXML($row['venue']) . '" '; echo 'activity="' . parseToXML($row['activity']) . '" '; } ?> 

Когда я устанавливаю флажок, все эхо-команды отлично работают и отображают на экране все записи, где GFOption = «1». Но когда я просматриваю источник страницы, все записи повторяются там. Это, однако, характерно для того, что у меня есть в инструкции else из условия if. Если флажок установлен или снят флажок, все, что у меня есть в инструкции else, и если есть результат, он печатается на источник страницы.

Еще одна интересная вещь заключается в том, что если я буду жестко закодировать мое условное утверждение if

 if (true) 

или

 if (false) 

заявления работают точно так, как они должны, и никакой странной печати источника страницы не происходит.

Если я сделаю

 var_dump(isset($_POST['GFCheckbox']) 

Я получаю правильные логические значения в зависимости от того, проверен ли GFCheckbox или нет.

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

Solutions Collecting From Web of "Проблема с $ _POST, если isset () и mysql_fetch_assoc (): echo возвращает правильное значение, источник страницы всегда возвращает значение else"

Кажется, вы все еще проверяете isset (), хотя вопрос не в том, установлен ли он, вопрос в том, является ли он истинным или ложным. PHP много перерабатывает, когда вы проверяете переменные как booleans, но isset () в переменной набора, содержащей false , по-прежнему возвращает true.

Попробуйте торговать

 if (isset($_POST['GFCheckbox'])) 

для

 if ($_POST['GFCheckbox']) 

и посмотреть, что произойдет.

Я не вижу ничего в этом коде, предлагая, чтобы он выводил все записи при отправке с отмеченным флажком. Вероятно, при просмотре источника страницы он не отправляет данные POST, поэтому вы возвращаете все записи.

Если у вас есть панель инструментов веб-разработчиков для Firefox, вы можете проверить это, используя View Source -> View Generated Source или, альтернативно, Firebug, проверив DOM. В противном случае попробуйте просмотреть источник с помощью другого веб-браузера.

Здесь: http://jfcoder.com/test/checkbox.php

У меня есть:

 <html> <head> </head> <body> <pre> <?php print_r($_POST); if (isset($_POST['GFCheckbox'])) { $query = 'SELECT * FROM fdatav1 f INNER JOIN ddatav1 d USING(ID) WHERE (GFOption = "1")'; } else { $query = 'SELECT * FROM fdatav1 f INNER JOIN ddatav1 d USING(ID)'; } echo "\n\nQUERY: $query"; ?> </pre> <form method = "post" name = "testform" action="" > <input type = "checkbox" name = "GFCheckbox"> <input type = "submit" value="Submit"> </form> </body> </html> 

И это действует так, как вы описываете, что хотите. В частности, для использования предложения WHERE, если флажок установлен в форме submit.

Поэтому я не думаю, что это утверждение if. Если вы используете MySQL, ваш запрос выглядит неправильно .

ПРИМЕЧАНИЕ . Я думаю, что большинство / все (см. Третью заметку) системы реляционных баз данных используют синтаксис одиночной кавычки, но я не уверен.

ВТОРОЕ ПРИМЕЧАНИЕ . Я действительно ищу документацию, чтобы убедиться, что это правда. Я всегда думал, что нужны одиночные кавычки.

ТРЕТЬЕ ЗАМЕЧАНИЕ : на самом деле это НЕ проблема с MySQL, см. Когда необходимо вставлять в базу данных MySQL двойные кавычки и другие символы? Чтобы получить больше информации.

 $query = ' SELECT * FROM fdatav1 f INNER JOIN ddatav1 d USING(ID) WHERE (GFOption = "1") '; 

Вам нужно использовать одинарные кавычки для проверки WHERE, а не двойные кавычки . Я бы придерживался одинарных кавычек для согласованности, но, по-видимому, это не требуется MySQL.

 $query = ' SELECT * FROM fdatav1 f INNER JOIN ddatav1 d USING(ID) WHERE GFOption = \'1\' '; 

Или:

 $query = " SELECT * FROM fdatav1 f INNER JOIN ddatav1 d USING(ID) WHERE GFOption = '1' "; 

Я считаю, что это, вероятно, потому, что ваши результаты не работают должным образом.

Кроме того, ИМО вы не должны использовать isset() для if, но должны проверить фактический отчет о состоянии; то есть …

 if ($_POST['GFCheckbox'] == 'on') { 

И я могу сделать это по-другому (см. Комментарий):

 $WHERE = ""; if (isset($_POST['GFCheckbox'])) { if ($WHERE == '') { $WHERE = "WHERE "; } $WHERE = "GFOption = '1'"; } // This way it's easier to add options // and edit your base query later. // For instance, in case you add a // GROUP, LIMIT or ORDER BY. if (isset($_POST['ABCCheckbox'])) { if ($WHERE == '') { $WHERE = "WHERE "; } else { $WHERE = " AND "; } $WHERE = "ABCOption = 'efg'"; } $query = " SELECT * FROM fdatav1 f INNER JOIN ddatav1 d USING(ID) $WHERE "; 

Используйте переменные $ _GET или $ _SESSION

Проблема сводилась к Google Chrome. Проблема, с которой я столкнулась, была признанной ошибкой в ​​программном обеспечении: http://code.google.com/p/chromium/issues/detail?id=523, которые, я считаю, они исправляют в будущих выпусках Google Chrome. Я только что обновил мой и все еще работает неправильно.

Я переключил браузеры в Firefox и Explorer, и они отображали все правильно, даже после вывода XML, с которым я работал.

Кредит для этого решения выходит на Roe за то, что он указывает на проблему с потенциальным браузером.

Согласно другим сообщениям, использующим $ _GET вместо $ _POST, он должен работать нормально. Переменные $ _SESSION также должны делать трюк.

Если флажок не установлен, то $ _POST ['GFCheckbox'] = 0, else $ _POST ['GFCheckbox'] = 1

 <head> </head> <body> <form method = "post" name = "testform" action = "testgenxml.php" > <input type = "hidden" name="GFCheckbox" value= "0" > <input type = "checkbox" name = "GFCheckbox" value= "1" > <input type = "submit" value="Submit"> </form> </body> </html>