【问题标题】:how to split a string into substring using php如何使用php将字符串拆分为子字符串
【发布时间】:2014-05-14 05:42:19
【问题描述】:

我有一个像“dubai,sharjah”这样的字符串,我想把它变成这样的“dubai”,“sharja”,

我正在使用 ajax 和 my code 在 url 中传递值 dubai,sharjah

$city=$_GET['city'];

$sql  = "SELECT * FROM filter where isdeleted = 0 ";

if ($city !="" && $city !="Empty" ){
     $sql.=" and twon in ('".$citydata."')";     

            }

当我像这样打印查询时

SELECT * FROM filter where isdeleted = 0 and twon in ('dubai,sharjah,')

但我想要这样

SELECT * FROM filter where isdeleted = 0 and twon in ('dubai','sharja')

谁能指导我如何使用php做到这一点。

【问题讨论】:

  • 你从哪里得到$citydata
  • 如果您尝试生成一个实际用于运行查询的 sql 查询,我建议您在此处停下来阅读有关如何使用绑定变量的内容:@ 987654321@ 更好地保护自己免受 SQL 注入攻击。
  • $sql.=" and twon in ('".str_replace(",","','",$citydata)."')";
  • @GarySchreiner mysqli_stmt::bind_param 在处理一组值时是一场噩梦。对于这类事情,我推荐 PDO。
  • @Phil 我同意,只是想在 10 个答案出现之前匆忙完成准备好的陈述:) 正如我在对您的回答的评论中提到的那样,我发现您的解决方案是最佳选择。不幸的是,cmets 上的编辑窗口仅持续 5 分钟。

标签: php mysql


【解决方案1】:

以下是我的处理方法。我将使用 PDO 而不是 mysqli 因为尝试将数组放入 mysqli_stmt::bind_param 只是一种痛苦。

首先,创建一个城市数组,删除所有空值

$params = array_filter(explode(',', $city), function($c) {
    return !empty($c) && $c !== 'Empty';
});
$paramCount = count($params);

$query = 'SELECT * FROM filter where isdeleted = 0';

现在为您准备好的语句生成一个占位符字符串。

if ($paramCount) {
    $placeholders = implode(',', array_fill(0, $paramCount, '?');
    // looks something like '?,?'

    $query .= " AND twon IN ($placeholders)";
}

现在,准备一份声明

// assuming you have a PDO instance in $pdo created with something like
// $pdo = new PDO('mysql:host=localhost;dbname=your_db;charset=utf8', 'username', 'password', [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);

$stmt = $pdo->prepare($query);

执行并获取值:)

$stmt->execute($params);
$filters = $stmt->fetchAll(PDO::FETCH_ASSOC);

【讨论】:

    【解决方案2】:
    $cities = explode(",", $_GET['city']);
    
    //escape!
    foreach ($cities as $citykey => $city) {
        $cities[$citykey] = "'" . mysql_real_escape_string($city) . "'";
    }
    
    $sql = "SELECT * FROM `filter` where `isdeleted` = 0";
    if (!empty($cities)) {
        $sql .= ' and `twon` in (' . implode(',', $cities) . ')';
    }
    

    【讨论】:

    • 请记住,mysql 扩展已被正式弃用,不再维护。
    【解决方案3】:

    另一种方法是使用FIND_IN_SET()。无需更改 PHP 代码。

    $sql.=" and FIND_IN_SET(town, '".$citydata."')";   
    

    【讨论】:

    • +1。对此一无所知。以后遇到类似情况肯定会用的
    【解决方案4】:

    在 6 个答案之后哇,必须添加第 7 个

    $sql.=" and twon in ('".str_replace(",","','",$citydata)."')";

    【讨论】:

      【解决方案5】:

      你可以尝试炸开字符串

      $cityparts = explode(",",$city);
      

      你可以使用

      $cityparts[0] and $cityparts[1] in your query 
      
      array explode ( string $delimiter , string $string [, int $limit ] )
      

      您可以在 [http://www.php.net/explode]

      上找到更多信息

      希望这会有所帮助!

      【讨论】:

        【解决方案6】:

        你只需要在这里爆炸和内爆。休息是最后在你的字符串中有额外的, 的问题。

        $str = "dubai,sharjah,";
        $citydata = implode("','",explode(',',rtrim($str,',')));
        echo "'$citydata'";
        

        test

        【讨论】:

          【解决方案7】:

          你可以这样做。

          $string = 'dubai,sharjah';
          $cities = explode(',', $string);
          
          echo $cities[0]; //dubai
          echo $cities[1]; //sharjah
          

          【讨论】:

          • 这将打印"dubaisharjah",而不是"dubai", "sharjah"。这可能会更好:echo $cities[0].", ".$cities[1]
          • @YUNOWORK "twon in ($cities[0], $cities[1])" 不是很明显吗?
          • 对我来说不是,但它仍然是清晨,我不应该在上午 8:00 之前提出改进建议。 :s
          • 问题不想打印。他只想作为数组传递
          • @YUNOWORK 我们都去过那里。
          【解决方案8】:

          试试这个

          $str = "dubai,sharjah,";
          $arr = explode(",", $str);
          $arr_temp = array()
          foreach($arr as $s)
          {
             if($s!="")
             {
                $arr_temp[] = "'".$s."'";
             }
          }
          
          $new_str = implode(",", $arr_temp); 
          echo $new_str;  // output 'dubai','sharjah'
          

          现在你的 Sql 将是

          $sql = "SELECT * FROM filter where isdeleted = 0 and twon in ($new_str) ";
          

          【讨论】:

            【解决方案9】:

            你可以使用它 在$city 中我用 修复了两个值,你可以在这里使用$_GET ;

            $city = "dubai,sharjah,";
            $query_string ="";
            $words = explode(",",$city);
                        for($i=0;$i<count($words);$i++){$query_string .= "'".$words[$i]."',";}
                        $query_string = substr($query_string,0,strlen($query_string)-4);
            

            然后使用您的查询

            SELECT * FROM filter where isdeleted = 0 and twon in ($query_string)
            

            【讨论】:

              【解决方案10】:
              if ($city !="" && $city !="Empty" )
              {
                   $city_exp = explode(',' $city);
                   $sql .= " and twon in ('".implode("', '", $city_exp)."')"; 
              }
              

              我们在这里所做的基本上是使用explode 将两个值放入一个数组中,然后使用implode 分隔该数组中的每个项目

              DEMO

              【讨论】:

              • 如果其中一个城市是 Sha'am 或类似的,则效果不佳~codepad.viper-7.com/r5F0bi
              • 该值来自 URL 查询字符串。可以是任何东西
              • 这个答案鼓励关于通过 PHP 与数据库交互的不良做法。您应该按照@Phil 的回答使用准备好的语句
              • @Alex.Ritna 你是对的。但我认为 OP 不会努力切换到 PDO/mysqli。
              • @asprin 恕我直言,SO 不仅适用于 OP,也适用于在 Google 上找到此问题和答案的其他所有人。也许一个好的编辑是:“虽然这回答了你的问题,但这是一种更好的方法,它不会受到攻击。”我敢打赌,大多数搜索此类内容的人可能从未听说过准备好的陈述,这将是他们第一次暗示他们。
              猜你喜欢
              • 1970-01-01
              • 2015-12-28
              • 1970-01-01
              • 1970-01-01
              • 2011-11-25
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多