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

问题描述 投票:2回答:1

背景信息:我处理管理文件的应用程序(专业人员,而非个人)。 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

如果您需要任何其他信息,请告诉我。

php mysql mysqli codeigniter-3
1个回答
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执行之前没有技术上完成插入。到过那里。 ;)

© www.soinside.com 2019 - 2024. All rights reserved.