簡體   English   中英

插入后不返回插入行時選擇

[英]Select after insert doesn't return the inserted row

背景信息:我致力於管理文件的應用程序(專業而非個人)。 UI是基於Web的,底層文件管理功能是基於Java的。

每個文件和目錄在此應用中均稱為“節點”,並且在表中具有一行,用於存儲其索引節點,名稱,父ID等。

問題:例如,當我們執行添加節點或重命名之類的操作時,將調用java函數來相對於實際文件系統更新數據庫。

我只有在復制節點時才有問題(即使調用與復制相同的java函數,添加,重命名,刪除,...一個節點都可以完美地工作)==>復制文件,然后調用java函數(在這種情況下,它將對新文件的信息進行SQL插入),最后我在PHP中進行選擇以獲取復制文件的節點ID。

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

我嘗試過的事情:不是時間安排(我已經花了20秒鍾的睡眠時間進行測試,並有時間查看PMA中的行),並且在CodeIgniter中禁用了所有緩存(並且我已經將各種轉儲放入了CodeIgniter代碼進行確認)。 我也嘗試使用CodeIgniter的PDO驅動程序,結果完全相同。 我試圖刪除where子句中的某些條件(也完全刪除了where子句),再次刪除相同的結果。

唯一有效的方法是打開與數據庫的新連接,並按照以下代碼重做查詢:

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)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經常發生)或在選擇執行之前在技術上還沒有完成插入。 到過那里。 ;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM