增量在10点停止

时间:2014-03-27 12:36:43

标签: php mysql database

我正在尝试通过将每个重复值递增1来从插入到mysql数据库的csv文件中增加值。 因此,如果我将'processor-intel'插入我的数据库,如果存在,csv的值将增加1.这将导致'processor-intel1'等等。 如果我在我的csv中有13次“nvidia-graphic-card”,但是使用不同的规格,增量从1到10,结果将是:

'nvidia-graphic-card',
'nvidia-graphic-card1',
'nvidia-graphic-card2',
'nvidia-graphic-card3',
........
'nvidia-graphic-card9',
'nvidia-graphic-card10',
'nvidia-graphic-card10',
'nvidia-graphic-card10'

为什么增量在10点停止?

这是我使用的增量函数:

  function increment_string($str, $separator = '-', $first = 1){
  preg_match('/(.+)'.$separator.'([0-9]+)$/', $str, $match);

  return isset($match[2]) ? $match[1].$separator.($match[2] + 1) : $str.$separator.$first;

}

我正在将csv中的每一行与数据库进行比较

$verificare = $database->select("SELECT alias FROM produse WHERE alias LIKE '%".$alias."%'");

for($x=0;$x<$database->countRows();$x++){
  if($alias == $verificare['alias'][$x]){
    $alias = $this->increment_string($verificare['alias'][$x], '-', 1);
  }else{
    $alias = $alias;
  }
}

这是导入csv的完整代码

    if($request->get($_POST["action"]) == "import"){

   $file = $upload->file_upload("import", "media/import");
   if(file_exists(DIR_UPLOAD_PHOTO . "/media/import/" . $file)){

        $file = DIR_UPLOAD_PHOTO . "/media/import/" . $file;
        $handle = fopen($file, "r");

        if ($handle) { 
            $lines = explode("\r", fread($handle, filesize($file))); 
        }  

        $total_array = count($array);

        $x = 0;

        foreach($lines as $line){

            if($x >= 1){
                $data = explode("|", $line);

                $titlu          = trim(addslashes($data[0]));
                $alias          = $this->generate_seo_link($titlu);
                $gramaj         = trim($data[1]);
                $greutate       = trim($data[2]);
                $pret_total     = trim($data[3]);
                $pret_redus     = trim($data[4]);
                $poza           = trim($data[5]);
                $pret_unitar    = trim($data[6]);
                $categorie      = trim($data[7]);
                $brand          = trim(addslashes($data[8]));
                $descriere      = trim(addslashes($data[9]));
                $vizibil        = trim($data[10]);
                $cod            = trim($data[11]);
                $nou            = trim($data[12]);
                $cant_variabila = trim($data[13]);
                $congelat       = trim($data[14]);
                $tva            = trim($data[15]);
                $stoc           = trim($data[16]);


                if($cod != "" && $cod != " "){

                    $verificare = $database->select("SELECT alias FROM produse WHERE alias LIKE '%".$alias."%'");   

                    for($x=0;$x<$database->countRows();$x++){
                        if($alias == $verificare['alias'][$x]){
                            $alias = $this->increment_string($verificare['alias'][$x]);
                        }else{
                            //$alias = $alias;
                        }
                    }




                    $database->insert(sprintf("insert into produse set 
                                                titlu='%s', 
                                                alias='%s',
                                                gramaj='%s', 
                                                greutate='%s', 
                                                prettotal='%s', 
                                                pretredus='%s', 
                                                poza='%s', 
                                                pretunitar='%s', 
                                                categorie='%d', 
                                                brand='%s', 
                                                descriere='%s', 
                                                vizibil='%d', 
                                                cod='%s', 
                                                nou='%d', 
                                                cant_variabila='%d', 
                                                congelat = '%d',
                                                tva = '%s',
                                                stoc = '%d'

                                                on duplicate key update

                                                titlu='%s',
                                                gramaj='%s', 
                                                greutate='%s', 
                                                prettotal='%s', 
                                                pretredus='%s', 
                                                poza='%s', 
                                                pretunitar='%s', 
                                                categorie='%d', 
                                                brand='%s', 
                                                descriere='%s', 
                                                vizibil='%d', 
                                                cod='%s', 
                                                nou='%d', 
                                                cant_variabila='%d', 
                                                congelat = '%d',
                                                tva='%s',
                                                stoc= '%d'", 

                                                $titlu, $alias, 
                                                $gramaj, $greutate, $pret_total, $pret_redus, $poza, $pret_unitar, $categorie, 
                                                $brand, $descriere, $vizibil, $cod, $nou, $cant_variabila, $congelat, 
                                                $tva, $stoc, 

                                                $titlu, $gramaj, $greutate, 
                                                $pret_total, $pret_redus, $poza, $pret_unitar, $categorie, $brand, $descriere, 
                                                $vizibil, $cod, $nou, $cant_variabila, $congelat, $tva, $stoc));    


                }
            }   
            $x++;
        }  



   }
}

3 个答案:

答案 0 :(得分:1)

如果您的别名列类型设置为varchar ..将其更改为文本。

SQLite Query Stops Incrementing at 10

答案 1 :(得分:0)

你的preg_match找到了nvidia-graphic-card1并且对数字感到满意,并且不检查10.它被称为greedy or lazy。 阅读并重写你的正则表达式。

您可以使用regex101.com轻松测试正则表达式语句。

此正则表达式将您的数字与结果的其余部分分开,并以3美元的价格为您提供数字:

$re = '/(.+)([^0-9]{1})([0-9]{1,})$/'; 
$str = 'nvidia-graphic-card10'; 
preg_match($re, $str, $matches);
var_dump($matches);

请参阅此here

答案 2 :(得分:0)

你真的需要“分隔符” - 它看起来好像只能匹配字符串末尾的数字 - 默认情况下 PHP 正则表达式是贪婪的(不是100%确定其他答案是什么)?

function increment_string($str){
    return preg_replace_callback('/\d*$/', function($match){
        return intval($match[0])+1; 
    }, $str, 1);
}

demo