【问题标题】:Check if the folder/file already exists in the database检查文件夹/文件是否已存在于数据库中
【发布时间】:2014-02-20 09:03:05
【问题描述】:

我的服务器上有一些文件要放入数据库。我将在数据库中添加更多信息,例如有关文件的 cmets(在我解决此问题后,文件的 SQL 查询将更容易与数据库进行比较)并节省一些带宽。问题是我想查看数据库中是否已经存在文件夹/文件。如果没有,请将它们添加到数据库中。

这是我的代码目前的样子(sql() 是我创建的一个函数)(下面的代码仅呼应数据库中现有名称的名称以用于开发目的):

$dir = new RecursiveDirectoryIterator($admin['data_folder_main'], FilesystemIterator::SKIP_DOTS);
$it = new RecursiveIteratorIterator($dir, RecursiveIteratorIterator::SELF_FIRST);
$it->setMaxDepth(1);

foreach($it AS $fileinfo) {

    # DATABASE (fetch)
    $folder = sql("SELECT *
                   FROM items_folders
                   WHERE name_folder = :folder
                  ", Array('folder' => $it->getSubPath()), 'fetch');


    echo $folder['name_folder'].'<br>';

}

这是数据库的样子:

CREATE TABLE IF NOT EXISTS `items_folders` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_folder` int(11) NOT NULL DEFAULT '0',
  `name_folder` text NOT NULL,
  `name_folder_sub` text NOT NULL,
  PRIMARY KEY (`id`)
)

问题是上面的代码从数据库中打印出现有的名称,然后回显该名称的次数与服务器上文件夹中的文件夹/文件相同。这就是我想要的:该文件夹是否存在于数据库中?是或否。

是吗?好的!忽略它(不要将它添加到数据库中)。继续下一个文件夹/文件(如果有的话)。

没有?将其添加到数据库中。继续下一个文件夹/文件(如果有的话)。

我怎样才能做到这一点?

【问题讨论】:

标签: php sql database


【解决方案1】:

您只需要测试是否有值,如果没有,则将该项目添加到数据库中

foreach($it AS $fileinfo) {

    # DATABASE (fetch)
    $folder = sql("SELECT *
                   FROM items_folders
                   WHERE name_folder = :folder
                  ", Array('folder' => $it->getSubPath()), 'fetch');


   //test to see if there is a value in the database
      if($folder['name_folder']==''){
          // if not, add it
          strSQL = "UPDATE items_folders SET name_folder='". $folder['name_folder'] . "' WHERE id= ". $folder['id'];
         //you don't tell us if you are using PDO or mysql_ so do your own execution
         execute;
         echo "item added";
      }
}

未经过测试,但它让您知道该怎么做。

【讨论】:

  • 注意语法高亮,它是怎么关闭的?我认为这是WHERE id= ". $folder['id']" 这行需要WHERE id= '". $folder['id']"'
  • 谢谢,但是您需要在人们发布后给他们一分钟左右的时间进行编辑。
  • 抱歉,只是想避免其他人可能对您投反对票。我不那样做,这不是我的风格,但有一些人就是这样做的,并且乐于这样做。 ;-)
  • np,如果 OP 按原样使用我的代码而不检查或修改它,那就更愚弄他们 :o)
  • 是的。 OP将了解总体思路。但是,编写实际上也是可行代码的伪代码是一种很好的做法。 SO 的语法突出显示是一个死的赠品,有些人可能不知道如何处理它,认为“嘿,它一定很好,这是一个答案”。我们不知道其他人的能力/知识。 ;-) 你知道,我知道,但其他人可能不会(甚至可能是 OP)。只是试图帮助并涵盖所有基础。
【解决方案2】:

如果你使用

" SELECT CAST(COUNT(*) AS BIT) AS existing FROM items_folders WHERE name_folder = :folder"

您应该得到一个布尔返回值(如果存在,则为 true 或 1)。

"SELECT DISTINCT * FROM items_folders WHERE name_folder = :folder"

删除所有双精度值,如果您想插入不存在的文件夹,请使用:

"[Insert-Statement] WHERE NOT EXISTS (SELECT * FROM items_folders WHERE name_folder = :folder)"

【讨论】:

  • 谢谢,但我在尝试您的解决方案时收到此错误消息:Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'EXISTS( SELECT * FROM items_folders WHERE name_folder = '')' at line 1' in ...
  • 那是因为你需要绑定你的值。您使用的是bindParambindValue,对吗? @ErikEdgren
  • 然后尝试在存在之前添加选择
  • Fred-ii-:不。我不使用bindParambindValue,但我可能会这样做:) niccomatik:这也不起作用 - 同样的错误
  • @niccomatik 恐怕不是 :( Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'BIT) FROM items_folders WHERE name_folder = 'test-folder'' at line 1' in ...。我将 'fetch' 更改为 'count',因为 COUNT(*) 在该查询中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-05
  • 2019-03-26
相关资源
最近更新 更多