$ _POST问题,如果是isset()和mysql_fetch_assoc():echo返回正确的值,页面源始终返回else值

时间:2011-04-17 16:16:46

标签: php mysql forms post

这个问题起初是一个不同的主题,但经过大量的搜索和缩小问题后,它已经发生了很大的变化,因此我认为开始一个新问题的链接可能与旧的问题有关。 :

Variable concatenated mysql query string runs fine in phpMyAdmin but not PHP in script

我不相信描述已经足够了,因为连接工作正常。

似乎我正在寻找这个问题。我有一个简单的表格:

<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”的所有记录。但是当我查看页面源时,所有记录都在那里回显。 然而,这对于if条件的else语句中的任何内容都是特定的。如果选中或取消选中该复选框,则执行else语句中的任何操作,如果有输出,则将其打印到页面来源。

另一件有趣的事情是,如果我将if条件语句硬编码到

if (true)

if (false)

语句完全按照它们的方式工作,并且不会发生奇怪的页面源打印。

如果我这样做

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

根据是否选中GFCheckbox,我得到正确的布尔值。

正如你所看到的,我正在与这个圈子一起跑,非常感谢任何帮助。

5 个答案:

答案 0 :(得分:0)

你似乎仍然在检查isset(),即使问题不是它是否设置,问题是它是真还是假。当你将变量检查为布尔值但是在一个包含false的上的isset()仍会返回true时,PHP会释放很多东西。

尝试交易

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

if ($_POST['GFCheckbox'])

看看会发生什么。

答案 1 :(得分:0)

我在该代码中看不到任何内容,建议在选中此框时提交所有记录。可能的情况是,当您查看页面源时,它不会发送POST数据,因此您将获得所有记录。

如果您拥有适用于Firefox的Web开发人员工具栏,则可以使用“查看来源”验证这一点 - &gt;通过检查DOM查看生成的源,或者使用Firebug。如果做不到这一点,请尝试使用其他网络浏览器查看来源。

答案 2 :(得分:0)

此处: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子句。

所以我认为这不是if语句。如果你正在使用MySQL,那么你的查询看起来是错误的

注意:我认为大多数/所有(参见第三个注释)关系数据库系统使用单引号语法,但我不确定。

SECOND NOTE :我实际上是在查找文档,看看是否属实。我当然一直认为需要单引号。

THIRD NOTE :这实际上不是MySQL的问题,有关详细信息,请参阅When is it necessary to escape double quotes and other characters when inserting them into MySQL database?

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

答案 3 :(得分:0)

使用$ _GET或$ _SESSION变量

问题归结为谷歌Chrome。我遇到的问题是该软件中一个公认的错误:http://code.google.com/p/chromium/issues/detail?id=523我相信他们正在修复未来版本的Google Chrome。我刚刚更新了我的,但仍然无法正常工作。

我将浏览器切换到Firefox和资源管理器,它们正确地呈现出来,甚至是我所追求的XML输出。

这个解决方案可以归功于Roe指出潜在的浏览器问题。

根据其他帖子使用$ _GET代替$ _POST应该可以正常工作。 $ _SESSION变量也应该可以解决问题。

答案 4 :(得分:0)

如果未选中复选框,则$ _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>