代码已更新
我有一个名为vote的表,其中包含三个字段ans_1,ans_2,ans_3 查询字符串编号是2或3根据管理员要保存的答案 所以它们看起来像这样?1 = aaa& 2 = bbb或?1 = aaa& 2 = bbb& 3 = ccc 我的观点是将每个查询字符串保存在一列中,所以我使用下面的代码,但它只使用查询字符串的最后一个值
$queries = $_SERVER['QUERY_STRING'];
$answers = explode("&",$queries );
$num = count($answers);
foreach($answers as $val){
$chars= strlen($val);
$test = substr($val,2,$chars-2);
for($x=1; $x<=$num; $x++){
$Q = "update vote set ans_'$x' = '$test' where Vote_ID = '1'";
$R = mysql_query($Q);
if($R) { echo "done"; } else { echo mysql_errno(); }
}
}
答案 0 :(得分:2)
如果您有要替换$x
的动态列,请不要将$x
括在引号中:
$Q = "update vote set ans_$x = '$test' where Vote_ID = '1'";
请务必使用$_SERVER['QUERY_STRING']
转义mysql_real_escape_string()
的内容。
$test = mysql_real_escape_string($test);
在PHP中解析查询字符串的正确方法是使用parse_str()
,而不是在explode()
上尝试&
。
$queryvars = array();
$parse_str($_SERVER['QUERY_STRING'], $queryvars);
foreach ($queryvars as $key=>$value) {
// do the loop
}
但是,由于您要抓取整个查询字符串,而不过滤任何特定变量,为什么不使用$_GET
?
$x = 0;
foreach ($_GET as $key=>$value) {
// do the loop...
$test = mysql_real_escape_string($value);
$Q = "update vote set ans_'$x' = '$test' where Vote_ID = '1'";
$x++;
}
为了帮助您了解代码无效的原因,我将在此处进行修改。但是,这不是执行此任务的首选方法。如上所述使用foreach($_GET)
要好得多。正确缩进循环将有助于揭示问题:
$queries = $_SERVER['QUERY_STRING'];
$answers = explode("&",$queries );
$num = count($answers);
// Your foreach loops over the available querystring params:
// Start by initializing $x to 0
$x = 0;
foreach($answers as $val){
$chars= strlen($val);
$test = substr($val,2,$chars-2);
// You are already inside the foreach loop, so
// you don't want to start another loop which uses the same value for $test
// on each iteration. Instead $x was set to 0 before the outer foreach...
// There is no need for an inner loop.
//for($x=1; $x<=$num; $x++){
// On first iter here, $x is 0. Increments at the end of the loop iter.
$Q = "update vote set ans_$x = '$test' where Vote_ID = '1'";
$R = mysql_query($Q);
if($R) {
echo "done";
} else {
echo mysql_errno();
}
// On each iteration, increment $x here.
$x++;
//} // the inner for loop, commented out...
}
答案 1 :(得分:1)
您需要删除单引号。尝试:
$Q = "update vote set ans_$x = '$test' where Vote_ID = '1'";
答案 2 :(得分:1)
删除变量周围的引号。如果您要获取查询的值,可能要使用mysql_real_escape_string
。
$Q = "update vote set `ans_$x` = '" . mysql_real_escape_string($test) . "' where Vote_ID = '1'";
答案 3 :(得分:1)
我的建议是不要在这种方法中使用SQL / PHP。
但是要回答它为什么不起作用,您不能使用PHP变量来设置查询中的列,就像您当前拥有它一样。
您需要将$Q = "update vote set ans_'$x' = '$test' where Vote_ID = '1'";
更改为:
$Q = "update vote set ans_$x = '$test' where Vote_ID = '1'";
请务必清理用户输入以获取您期望的数据类型。