$ _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(\"\'\",\'&#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 (true)
要么
if (false)
这些语句完全按照应有的方式工作,并且不会发生任何奇怪的页面源打印。 如果我做
var_dump(isset($_POST[\'GFCheckBox\'])
我是否根据GFCheckBox是否选中来获得正确的布尔值。 如您所见,我对此很感兴趣,非常感谢您的帮助。     

解决方法

即使问题不在于是否已设置,您似乎仍在检查isset(),问题在于它是对还是错。当您将变量检查为布尔值时,PHP会做很多事情,但是包含false的set变量上的isset()仍会返回true。 尝试交易
if (isset($_POST[\'GFCheckbox\']))
对于
if ($_POST[\'GFCheckbox\'])
看看会发生什么。     ,我在该代码中看不到任何内容,表明在选中复选框的情况下提交时将输出所有记录。当您查看页面源文件时,可能没有发送POST数据,因此您可以获取所有记录。 如果您具有Firefox的Web开发人员工具栏,则可以使用“查看源代码”->“查看生成的源代码”或通过检查DOM来使用Firebug进行验证。如果失败,请尝试使用其他Web浏览器查看源。     ,此处: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,则查询看起来不正确。 注意:我认为大多数/全部(请参阅第三注)关系数据库系统都使用单引号语法,但是我不确定。 第二注:我实际上是在寻找文档以查看是否正确。我当然一直认为单引号是必需的。 第三注:这实际上不是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不应将ѭ11用作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变量 问题归结为谷歌浏览器。我遇到的问题是该软件中一个公认的错误:http://code.google.com/p/chromium/issues/detail?id=523,我相信它们会在将来的Google Chrome浏览器版本中解决。我刚刚更新了我的,仍然无法正常工作。 我将浏览器切换到Firefox和Explorer,它们可以正确呈现所有内容,甚至包括我所追求的XML输出。 Roe指出了这种解决方案,指出了潜在的浏览器问题。 根据其他帖子,使用$ _GET代替$ _POST应该可以正常工作。 $ _SESSION变量也可以解决问题。     ,如果未选中复选框,则$ _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>