Проблема с $ _POST, если isset () и mysql_fetch_assoc (): echo возвращает правильное значение, источник страницы всегда возвращает другое значение - PullRequest
1 голос
/ 17 апреля 2011

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

Переменная конкатенированная строка запроса 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("'",'&#39;',$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']) . '" ';
  }
?>

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

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

if (true)

или

if (false)

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

Если я сделаю

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

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

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

Ответы [ 5 ]

0 голосов
/ 11 августа 2014

Если флажок не установлен, то $ _POST ['GFCheckbox'] = 0, иначе $ _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>
0 голосов
/ 18 апреля 2011

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

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

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

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

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

0 голосов
/ 17 апреля 2011

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

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

0 голосов
/ 17 апреля 2011

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

У меня есть:

<code><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";

?>

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

Так что я не думаю, что это утверждение 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'
";

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

Также, IMO, вы не должны использовать 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
";
0 голосов
/ 17 апреля 2011

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

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

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

для

if ($_POST['GFCheckbox'])

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...