Этот вопрос начался как другой поток, но после многого поиска и сужения проблемы он значительно изменился и, как таковой, я подумал, что может возникнуть вопрос о том, чтобы начать новый вопрос со ссылкой на старый:
Переменная конкатенированная строка запроса 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('<','<',$htmlStr); $xmlStr=str_replace('>','>',$xmlStr); $xmlStr=str_replace('"','"',$xmlStr); $xmlStr=str_replace("'",''',$xmlStr); $xmlStr=str_replace("&",'&',$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 или нет.
Как вы можете видеть, я бегаю по кругу с этим и очень ценю любую помощь.
Кажется, вы все еще проверяете 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>