在PHP中为逗号分隔的字符串添加引号

10

我有一个表单,其中包含一个选择多个选项的输入框,它会以这样的方式POST值:option1,option2,option3等等...

最好的方法是如何将其转换为'option1','option2','option3'等等...

目前我正在这样做,但感觉不对?

$variable=explode(",", $variable);
$variable=implode("','", $variable);
我这样做的原因是想在SQL查询中使用表单选择多个输入,使用IN语句。
SELECT * FROM TABLE WHERE some_column IN ('$variable')

怎么才能把第一个和最后一个引号 ' 放在一起呢?或者你是将它们放在了没有展示的代码里? - Francisco Presencia
2
不要像这样构建查询字符串。使用 PDO - user229044
meagar,为什么不呢?为什么PDO更好? - Per
如果你的CSV文件有一列数据是“嘿,查克·诺里斯”,但实际上它应该是一个单元格,那么你的脚本会把它搞得一团糟。 - AKS
你是如何让PHP代码以逗号分隔所选的值?你的HTML是什么? - Jeromy French
显示剩余3条评论
5个回答

14

您可以将任何代码包装在一个函数中,以消除“感觉不对”的感觉。例如:

function buildSqlInClauseFromCsv($csv)
{
        return "in ('" . str_replace(",", "','", $csv) . "') ";
}

我所说的 "感觉不对" 是指可能有更好的方法 :)你认为这个函数会更快地完成任务吗? - Per

4
如果 $variable = "option1,option2,option3",那么可以使用以下代码: "SELECT * FROM TABLE WHERE FIND_IN_SET(some_column, '$variable')"。

如何使用 NOT IN SET? - Kiran Reddy
1
Kiran Reddy:SELECT * FROM TABLE WHERE NOT FIND_IN_SET(some_column, '$variable') - Luke Wenke

3

我们知道implode将数组转换为字符串,需要提供分隔符和数组,如下所示,这里我们使用逗号作为分隔符。 Implode使用给定的分隔符将数组的每个元素分开,我已经用'(单引号)与分隔符连接起来。

 $arr = array();
    $arr[] = "raam"; 
    $arr[] = "laxman"; 
    $arr[] = "Bharat"; 
    $arr[] = "Arjun"; 
    $arr[] = "Dhavel"; 
    var_dump($arr);


    $str = "'".implode("','", $arr)."'";
    echo $str;

输出: 'raam','laxman','Bharat','Arjun','Dhavel'


虽然这可能回答了问题,但最好在您的答案中加入一些文本来解释您正在做什么。阅读如何编写良好的答案 - Jørgen R
感谢您的建议。 - Hardik Vyas

2
这是我所使用的内容:
WHERE  column IN ('".str_replace(",", "','", $_GET[stringlist])."')

太好了。如果可以在一行代码中完成,为什么还要使用implode和explode呢? - Ahmed Syed
喜欢它。非常简单的解决方案。 - Shuhad zaman

-1

在SQL中转义字符串只有一种正确的方法 - 使用数据库API提供的函数来转义SQL字符串。虽然mysyl_*提供了mysql_real_escape_string()

$choices = explode(",", $variable);

foreach($choices as &$choice)
    $choice = "'".mysql_real_escape_string($choice)."'";

$choices = implode(",", $choices);

PDO 提供了一个同时添加引号的方法:
$choices = explode(",", $variable);

foreach($choices as &$choice)
    $choice = $pdoDb->quote($choice);

$choices = implode(",", $choices);

请注意,PDO::prepare 在这里并不真正起作用


这是一个好的实践,但不幸的是并不是被问到的问题的答案。 - Asad Saeeduddin
@Hammerite:不建议使用——问题暗示提问者已经在使用它。 - Eric
@Asad:我原本以为它会为你添加引号。现在已经改用PDO版本,它会自动添加引号。 - Eric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接