Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 插入后选择不会返回插入的行_Php_Mysql_Mysqli_Codeigniter 3 - Fatal编程技术网

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

Php 插入后选择不会返回插入的行,php,mysql,mysqli,codeigniter-3,Php,Mysql,Mysqli,Codeigniter 3,背景信息:我的工作对象是应用程序专业人员,而不是管理文件的个人。UI基于web,底层文件管理功能基于Java 在这个应用程序中,每个文件和目录都被称为“节点”,并且在一个表中有一行存储其inode、名称、父id等 问题是:当我们执行诸如添加节点或重命名节点之类的操作时,会调用java函数来更新与实际文件系统相关的数据库 我有一个问题,只有当我们复制一个节点时,当我们添加,重命名,删除,所有的工作都很完美。。。一个节点,即使调用了与copy==>相同的java函数,也会复制文件,然后调用java函

背景信息:我的工作对象是应用程序专业人员,而不是管理文件的个人。UI基于web,底层文件管理功能基于Java

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

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

我有一个问题,只有当我们复制一个节点时,当我们添加,重命名,删除,所有的工作都很完美。。。一个节点,即使调用了与copy==>相同的java函数,也会复制文件,然后调用java函数。在本例中,它会对新文件infos执行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 PHP5.5 编码点火器3


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

1 Mysqli有一个用于获取最后一个插入id的方法。这将允许您只需使用该值,而无需选择

2打开mysql调试并观看它运行一次。你可能会找到解决办法

3我根本看不到INSERT,因此INSERT后面的SELECT语句。。。这不是我可以解决的问题,因为它只发生在特定类型的插入上

最后,您需要了解为什么此SELECT和另一个SELECT之间存在差异,并且您已经将其与前面的INSERT语句关联起来了。但是您没有提供INSERT语句,也没有显示此select与该INSERT的关联方式与其他INSERT的区别


因此,您需要打开mysql调试,并在语句运行时获取每个语句,以查看是否可以在java/php代码之外复制问题。也许您只是遇到了一种情况,java代码在AJAX中经常无序执行,或者在select执行之前还没有从技术上完成插入。我去过那里

确保$db是数据库的实例。var_dump检查实例值。运行任何简单的select查询,如果您没有得到任何结果,则db实例中存在错误。或者,如果您在codeigniter中的模型/控制器中,那么我猜其中一个将使用全局db对象$this->db->->->query'params',我确信它是正确的db对象,因为我已经转储了它,我还将转储放在db驱动程序本身中,一切正常;如果我删除where条件并且条件正确,我会得到结果,如果我在PMA中执行相同的查询,我会得到行。您无法检查某些地方的错误,特别是对$db2->query的调用。如果不检查错误,你永远不会知道你什么时候有错误。connect和queryWhy使用两种不同的连接$db和$db2?我假设,当插入超过$db2时,$db中的信息没有更新。