2

我正在使用以下格式的网络浏览器将参数传递给我的 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

我尝试过使用括号、括号等,它们都破坏了代码。有什么想法吗?谢谢,

编辑:我错误地假设错误发生的时间。尝试实际进行 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 查询?

4

5 回答 5

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);
于 2013-01-26T02:54:18.227 回答
0

不清楚为什么这样的测试对你不起作用。请注意<pre>print_r()严格用于调试。explode(',', $_GET['nums'])是关键。

echo '<pre>';
$nums_array = explode(',', $_GET['nums']);
print_r($nums_array);
echo '</pre>';

也许您需要与我们分享部分解析代码以更好地理解?

于 2013-01-26T03:01:41.260 回答
0

在发送页面上将逗号转换为更友好的内容

$nums = "1,2,3,4,5";
$nums = str_replace(',','|',$nums);

在接收 GET 的页面中执行以下操作:

$nums = str_replace('|',',',$nums);
于 2013-01-26T03:01:50.650 回答
0

如果你想要一个字符串,URL 对逗号进行编码?

www.site.php?age=1&sex=2&nums=1%2C2%2C3%2C4%2C5

此外,HTTP 具有 PHP 可以自动为您解释的参数的数组格式。我忘记了语法,但它非常简单。

编辑2:没关系,你想要字符串。

于 2013-01-26T02:51:42.027 回答
0

使用您当前的数据库界面,您不能。它使用准备好的语句。您的列表将被转换为字符串,因此不再是IN子句的值列表。

这就是为什么我例如使用这样的东西:

db("SELECT * from t1 WHERE id=? AND x IN (??)", $id, $array);

但是,您必须手动创建一些?,?,?,?,?占位符1,具体取决于输入列表长度(在提到的爆炸之后,或者更好的 str_getcsv 拆分之后)。是的,您需要枚举参数,而不是 :named 参数。

1正是因为它很无聊/乏味,所以我不在这里提供示例代码。

于 2013-01-26T03:18:36.977 回答