[英]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.