在插入后选择并不返回插入的行

时间:2017-07-28 10:20:26

标签: php mysql mysqli codeigniter-3

背景信息:我处理管理文件的应用程序(专业人员,而非个人)。 UI是基于Web的,低级文件管理功能是基于Java的。

每个文件和目录都被称为“节点”'在这个应用程序中,并在表中有一行存储其inode,名称,父ID等...

问题:当我们执行添加节点或重命名等操作时,会调用java函数来更新与真实文件系统相关的数据库。

我只有在复制节点时才会遇到问题(当我们添加,重命名,删除......一个节点时,即使调用相同的java函数,所有内容都能完美运行)==>复制文件,然后调用java函数(在这种情况下,它执行新文件信息的SQL插入),最后我在PHP中执行select以获取复制文件的节点ID。

在插入之后,我可以看到PhpMyAdmin中的行,但PHP中的select不会返回它。

我尝试了什么:这不是时间安排(我已经让20秒的睡眠进行测试并有时间在PMA中查看行)并且CodeIgniter中禁用了所有缓存(我已经在CodeIgniter代码中放置了各种转储来确认)。我也试过CodeIgniter的PDO驱动程序,结果完全一样。而且我试图删除where子句中的一些条件(以及where子句也是如此),同样的结果也是如此。

唯一有效的方法是打开与DB的新连接并重做查询,如下面的代码所示:

public function getIdForNode($name, $parentId) {
    $id = 0;
    $name = self::cleanName($name);
    $parentId = intval($parentId);
    if (empty($name)) {
        Log::error("\$name can't be empty.");
    } else if ($parentId < 0) {
        Log::error("\$parentId can't be < 0.");
    } else {
        $db = AppDatabase::getInstance();
        $sql = "SELECT node_ID
                FROM nodes
                WHERE inode_id > 0
                    AND parentNode_ID = ?
                    AND record_label = BINARY ?
                    AND record_deleted IS NULL";
        $result = $db->query($sql, [$parentId, $name])->row_array();
        ///////////////////////////////////////////////////////////////////
        if (empty($result)) {
            $db2 = new mysqli(DB_HOST, DB_USER, DB_PASS, DB_NAME);
            $result2 = $db2->query("
                SELECT node_ID
                FROM nodes
                WHERE inode_id > 0
                    AND parentNode_ID = ".$parentId."
                    AND record_label = BINARY '".$db2->escape_string($name)."'
                    AND record_deleted IS NULL
            ");
            $result = $result2->fetch_assoc();
            $result2->free();
            $db2->close();
        }
        ///////////////////////////////////////////////////////////////////
        $id = (!empty($result) && !empty($result['node_ID'])) ? intval($result['node_ID']) : 0;
    }
    return $id;
}

MySQL 5.5
PHP 5.5
CodeIgniter 3

如果您需要任何其他信息,请与我们联系。

1 个答案:

答案 0 :(得分:0)

1)Mysqli有一个用于获取最后一个插入ID的方法。这样您就可以简单地使用该值而无需选择。

http://php.net/manual/en/mysqli.insert-id.php

2)打开mysql调试并观察它运行一次。您可以找到解决方案。

3)我根本没有看到INSERT,因此插入后的SELECT语句不是我可以解决的问题(因为它只发生在某种类型的插入上)。

最后,您需要了解为什么此SELECT与另一个SELECT之间存在差异,并且您已将其与之前的INSERT语句相关联。但是,与其他插入相比,您没有提供INSERT语句,也没有显示此选择与该插入相关的区别。

因此,您需要启用mysql调试并在运行时获取每个语句,以查看是否可以在java / php代码之外复制问题。也许你只是有一个追逐的情况,java代码乱序执行(用AJAX发生很多)或者在select执行之前没有技术上完成插入。到过那里。 ;)