Php 在MySQL中中断一个特殊字符

Php 在MySQL中中断一个特殊字符,php,mysql,pipe,Php,Mysql,Pipe,我需要检查数据库中的管道|。如果我被发现,我需要以不同的方式玩 下面是我的db表的外观//请检查第11行中的|字符 如果我运行一个GROUPBYSQL命令,我的结果将是 这是正确的 但我的要求是在任何单元格中打破|,并给出相应的计数。预期结果如下: 这可以单独使用MySQL命令完成吗?或者我还需要使用一些php脚本吗 任何代码片段都会很有帮助。您可以使用php并按照下面的方式进行操作 $query = mysql_query("SELECT fruit FROM meva"); $cnt

我需要检查数据库中的
管道|
。如果我被发现,我需要以不同的方式玩

下面是我的db表的外观//请检查第11行中的|字符

如果我运行一个GROUPBYSQL命令,我的结果将是

这是正确的

但我的要求是在任何单元格中打破
|
,并给出相应的计数。预期结果如下:

这可以单独使用MySQL命令完成吗?或者我还需要使用一些php脚本吗


任何代码片段都会很有帮助。

您可以使用php并按照下面的方式进行操作

$query = mysql_query("SELECT fruit FROM meva");

$cnt_array   = array();

while($row   = mysql_fetch_assoc($query)){
     $fruits = $row["fruit"];
     $fruit  = explode("|", $fruits);
     foreach($fruit as $fru){

         if(array_key_exists($fru,$cnt_array)){
            $cnt_array[$fru]   = $cnt_array[$fru]+1;
         }
          else{
            $cnt_array[$fru]   = 1;
          }
     }  
    }

print_r($cnt_array);

注意:此代码未经测试,请尝试并进行相应编辑

您可以使用php并按如下方式执行

$query = mysql_query("SELECT fruit FROM meva");

$cnt_array   = array();

while($row   = mysql_fetch_assoc($query)){
     $fruits = $row["fruit"];
     $fruit  = explode("|", $fruits);
     foreach($fruit as $fru){

         if(array_key_exists($fru,$cnt_array)){
            $cnt_array[$fru]   = $cnt_array[$fru]+1;
         }
          else{
            $cnt_array[$fru]   = 1;
          }
     }  
    }

print_r($cnt_array);

注意:此代码未经测试,请尝试并进行相应编辑

我认为您应该修复数据。您可以在一行中运行这两条语句,直到所有数据都已修复:

INSERT INTO meva (fruits)
SELECT SUBSTR(fruits, LOCATE('|', fruits) - 1)  FROM meva
WHERE LOCATE('|', fruits) > 0;

UPDATE meva
SET fruits = SUBSTR(fruits, LOCATE('|', fruits) + 1)
WHERE LOCATE('|', fruits) > 0;
这会把桌子修好的

但是,如果只是从表中计算面试问题(或学校作业),则只有在知道给定行中管道的最大数量时,才能进行此操作

因此,如果一行中管道的最大数量为1,则select语句将为:

SELECT count(*),
CASE WHEN LOCATE('|', fruits) > 0 THEN SUBSTR(fruits, LOCATE('|', fruits) - 1) ELSE fruits END
FROM meva
GROUP BY CASE WHEN LOCATE('|', fruits) > 0 THEN SUBSTR(fruits, LOCATE('|', fruits) - 1) ELSE fruits END

如果一行中可以有多个管道,那么您的案例陈述将更加复杂

我认为您应该修复数据。您可以在一行中运行这两条语句,直到所有数据都已修复:

INSERT INTO meva (fruits)
SELECT SUBSTR(fruits, LOCATE('|', fruits) - 1)  FROM meva
WHERE LOCATE('|', fruits) > 0;

UPDATE meva
SET fruits = SUBSTR(fruits, LOCATE('|', fruits) + 1)
WHERE LOCATE('|', fruits) > 0;
这会把桌子修好的

但是,如果只是从表中计算面试问题(或学校作业),则只有在知道给定行中管道的最大数量时,才能进行此操作

因此,如果一行中管道的最大数量为1,则select语句将为:

SELECT count(*),
CASE WHEN LOCATE('|', fruits) > 0 THEN SUBSTR(fruits, LOCATE('|', fruits) - 1) ELSE fruits END
FROM meva
GROUP BY CASE WHEN LOCATE('|', fruits) > 0 THEN SUBSTR(fruits, LOCATE('|', fruits) - 1) ELSE fruits END

如果一行中可以有多个管道,那么案例语句将更加复杂

实际上最好的解决方案是更改数据结构。不建议使用此当前结构。每个“单元格”只能包含一个值。如果需要为特定ID存储多个FUIRT,请使用

id    fruit

11    Apple
11    Mango

这可能需要对代码/表进行一些调整,但这将防止将来需要更多的黑客攻击。

实际上,最好的解决方案是更改数据结构。不建议使用此当前结构。每个“单元格”只能包含一个值。如果需要为特定ID存储多个FUIRT,请使用

id    fruit

11    Apple
11    Mango

这可能需要对代码/表进行一些调整,但这将防止将来需要更多的黑客攻击。

希望此脚本可以帮助您

$frt =array();
$stmt = $mysqli->prepare("select `fruits` from `meva`") or $mysqli->error ;
$stmt->execute();
$stmt->bind_result($fruits);
 while ($stmt->fetch()) {
    $frt[]=$fruits;
  }

// var_dump($frt); //check all the fruits is in array  
 $res = array();
 $tot = count($frt);
 for($i=0;$i<=$tot;$i++)
  {

    if(preg_match("/\|/", $frt[$i]))
        {
    $res[] =explode( '|', $frt[$i]);
        }else
        {
    $res[] = $frt[$i];
        }
  }

 // var_dump($res);

$it = new RecursiveIteratorIterator(new RecursiveArrayIterator($res));
foreach($it as $v) {
  $ary[]=$v;
 }

    $all_fruits = array();
    $tot_ary = count($ary);
  for($io=0;$io<=$tot_ary;$io++)
    {
      if(isset($ary[$io])!='')
    {
     $all_fruits[] = trim($ary[$io]);
    }else
    {
      continue;
    }
    }
 // var_dump($all_fruits);

$newArray = array_count_values($all_fruits);

foreach ($newArray as $key => $value) {
        echo "$key - <strong>$value</strong> <br />"; 
}
$frt=array();
$stmt=$mysqli->prepare(“从'meva`'中选择'fruits')或$mysqli->error;
$stmt->execute();
$stmt->bind_结果($fruits);
而($stmt->fetch()){
$frt[]=美元水果;
}
//var_dump($frt)//检查所有水果是否排列整齐
$res=array();
$tot=计数($frt);

对于($i=0;$i希望此脚本可以帮助您

$frt =array();
$stmt = $mysqli->prepare("select `fruits` from `meva`") or $mysqli->error ;
$stmt->execute();
$stmt->bind_result($fruits);
 while ($stmt->fetch()) {
    $frt[]=$fruits;
  }

// var_dump($frt); //check all the fruits is in array  
 $res = array();
 $tot = count($frt);
 for($i=0;$i<=$tot;$i++)
  {

    if(preg_match("/\|/", $frt[$i]))
        {
    $res[] =explode( '|', $frt[$i]);
        }else
        {
    $res[] = $frt[$i];
        }
  }

 // var_dump($res);

$it = new RecursiveIteratorIterator(new RecursiveArrayIterator($res));
foreach($it as $v) {
  $ary[]=$v;
 }

    $all_fruits = array();
    $tot_ary = count($ary);
  for($io=0;$io<=$tot_ary;$io++)
    {
      if(isset($ary[$io])!='')
    {
     $all_fruits[] = trim($ary[$io]);
    }else
    {
      continue;
    }
    }
 // var_dump($all_fruits);

$newArray = array_count_values($all_fruits);

foreach ($newArray as $key => $value) {
        echo "$key - <strong>$value</strong> <br />"; 
}
$frt=array();
$stmt=$mysqli->prepare(“从'meva`'中选择'fruits')或$mysqli->error;
$stmt->execute();
$stmt->bind_结果($fruits);
而($stmt->fetch()){
$frt[]=美元水果;
}
//var_dump($frt);//检查数组中的所有水果
$res=array();
$tot=计数($frt);

对于($i=0;$ire,请认为您的数据结构在一个不同的列中存储“Mango”。标准化是问题的关键。重新考虑您的数据结构,将“Mango”存储在一个不同的列中。标准化是问题的关键。