我正在使用以下格式的网络浏览器向我的php代码传递一个参数:
www.site.php?age=1&sex=2
然后在访问这些参数的代码中:
'age' => $_GET['age']
'sex' => $_GET['sex']
一个参数需要是一组逗号分隔值(即“1,2,3,4,5”)。当我执行以下操作时,只会解释第一个值:
www.site.php?age=1&sex=2&nums=1,2,3,4,5
我尝试过用parens,括号等来破坏代码。有什么想法吗?谢谢,
编辑:错误发生时我错误地假设了。尝试实际进行sql调用时发生错误:
这有效:
$sql = <<<SQL
SELECT * from db
WHERE age=:age AND nums in (1,2)
SQL;
$query = $dbs['base']['connection']->prepare($sql);
$query->execute(array(
':age' => $_GET['age'],
));
但是当我传入内心时它失败了:
$sql = <<<SQL
SELECT * from db
WHERE age=:age AND nums in (:nums)
SQL;
$query->execute(array(
':age' => $_GET['age'],
':nums' => $_GET['nums']
));
当我打印$ _GET ['nums']时,逗号分隔值就可以了。如何正确地将'nums'参数传递给sql查询?
答案 0 :(得分:1)
你试过urlencode
吗?
// set
$nums = urlencode(join(',', array(1,2,3,4,5)));
// get
$nums = explode(',', urldecode($_GET['nums']));
// i think needs sanitize
$nums = array_map('intval', $nums);
答案 1 :(得分:0)
如果你想要一个字符串,URL会对逗号进行编码吗?
www.site.php?age=1&sex=2&nums=1%2C2%2C3%2C4%2C5
此外,HTTP具有PHP可以自动解释的参数的数组格式。我忘记了语法,但它非常简单。
编辑2:没关系,你想要字符串。
答案 2 :(得分:0)
不清楚为什么这样的测试不适合你。请注意,<pre>
和print_r()
严格用于调试。 explode(',', $_GET['nums'])
是关键。
echo '<pre>';
$nums_array = explode(',', $_GET['nums']);
print_r($nums_array);
echo '</pre>';
也许您需要与我们分享部分解析代码才能更好地理解?
答案 3 :(得分:0)
在发送页面上将逗号转换为更友好的内容
$nums = "1,2,3,4,5";
$nums = str_replace(',','|',$nums);
在接收GET的页面中,执行以下操作:
$nums = str_replace('|',',',$nums);
答案 4 :(得分:0)
使用您当前的数据库界面,您不能。它使用预准备语句。您的列表将转换为字符串,因此不再是IN
子句的值列表。
这就是为什么我要使用这样的东西:
db("SELECT * from t1 WHERE id=? AND x IN (??)", $id, $array);
然而,您必须手动创建一些?,?,?,?,?
占位符 1 ,具体取决于输入列表长度(在提到的爆炸后,或更好的str_getcsv拆分)。是的,你需要枚举参数,而不是:命名参数。
1 正是因为它无聊/乏味我才在这里提供示例代码。