问题描述
|
这个问题是从另一个线程开始的,但是在大量搜索和缩小问题范围之后,它已经发生了相当大的变化,因此,我认为开始一个新问题的链接可能与旧问题有关:
变量串联的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\']) . \'\" \';
}
?>
当我选中该复选框时,所有的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>