使用PHP为foreach循环的每次迭代创建和存储(mysql)唯一的id

时间:2014-05-22 18:02:43

标签: php mysql database

概述:

我正在遍历文件目录以查找所有SQL文件,然后使用PHP在文件中执行MYSQL查询并将所有数据存储在同一个表中。

我这样做是因为每个SQL文件都包含插入到同一数据库表中的客户端数据。我在同一个表中创建了一个client_id列。

对于找到的每个SQL文件,我需要生成并将唯一的客户端ID插入到执行SQL文件的同一个表中,以便我可以使用该ID来关联数据库中其他表的数据。

我的问题:

我无法编辑文件目录中的SQL文件,以便在其中的insert语句中添加唯一的id。

我无法在 foreach 中运行 UPDATE 语句,因为它会更新整个表并覆盖以前文件的client_id。

如果我要运行 UPDATE ,我无法添加 WHERE 子句,因为除了文件名之外,我没有任何唯一的文件可以匹配它。< / p>

我的代码:

下面是文件目录的迭代,它执行每个文件中的语句:

$dir = new DirectoryIterator('path_to_sql_files');

foreach($dir as $file){
if(!$file->isDot() && $file->isFile() && strpos($file->getFilename(), '.sql') !== false){

  $content = file_get_contents($file->getPathname()); //Reads entire file into a string
     if($content)
     {    
  /* because the .sql export file contains multiple queries per file, we 
    have to iterate through each statement within the file and store them as variables then remove the ";" delimiter 
    to roll all the statements into one and eventually execute it.
    this is because the PHP mysql_query() function does not support multiple queries. 
  */

    $queries = file($file->getPathname()); //Reads entire file into an array

    while(list($i, $query) = each($queries)){ //store each mysql statement as a variable 

       $query = trim($query, ';'); //Strip the delimiter from the end of the string

          if(!empty($query)){ // if there is actually something to execute...

              mysql_query($query); // ...execute it

             }
          } 
      }
  }
}

总结:

如果有人有办法让我为每个文件生成一个唯一的id,并以某种方式同时将它放到同一个数据库表中,那真的很棒。或者也许是数据库处理它的方法?

1 个答案:

答案 0 :(得分:1)

更改表并添加一个自动递增的主键(让这个名称为id),在您添加的另一列旁边(您命名为client_id的列)。

现在,如果您假设文件名是您的唯一ID,则可以执行以下操作:

$filename = mysql_real_escape_string($file->getPathname());
while(list($i, $query) = each($queries)) {
    $query = trim($query, ';');
    if(!empty($query)){
        if (mysql_query($query)) {
            mysql_query("update MyTable set client_id = '$filename' where id = last_insert_id()");
        }
    }
}

这里发生的是last_insert_id()总是返回完成的最后一次插入的id,如果插入的表包含一个auto_increment的主键。因此,您可以在每次查询后使用该ID来标记该行。