这个问题起初是一个不同的主题,但经过大量的搜索和缩小问题后,它已经发生了很大的变化,因此我认为开始一个新问题的链接可能与旧的问题有关。 :
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('<','<',$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条件语句硬编码到
if (true)
或
if (false)
语句完全按照它们的方式工作,并且不会发生奇怪的页面源打印。
如果我这样做
var_dump(isset($_POST['GFCheckbox'])
根据是否选中GFCheckbox,我得到正确的布尔值。
正如你所看到的,我正在与这个圈子一起跑,非常感谢任何帮助。
答案 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>