2016-04-28 36 views
0

此代碼的工作原理,但問題是,如果多人同時使用它會導致一些人不會註冊的意義上的問題。所以我需要重寫這個方式,在下一個人的查詢開始之前,每個人的所有查詢都會被執行並完成。多個查詢與mysqli中的php代碼在當時一個人

首先,代碼從數據庫中讀取,以便獲得到目前爲止所有註冊人員的字符串。

 $sql_s = $con -> query("select * from schedule where date='$date'"); 
$row_schedule = $sql_s->fetch_array(MYSQLI_BOTH); 
     $participants = $row_schedule['participants']; 

$參與者是一個字符串,它看起來像「‘薩拉’:‘理查德’:‘格雷格’」

現在當前用戶(弗雷德裏克)希望它的名字加入到這樣的字符串

$current_user='Fredrik'; 
$participants_new=add_participant($participants,$current_user); 

add_participant是一個php函數,它爲參與者字符串添加'Fredrik'。然後我想用新的SQL數據庫這樣

$sql = $con->query("UPDATE schedule SET participants='{$participants_new}' where date='{$date}'"); 

的具體問題是,如果另一個人(琳達)讀取數據庫弗雷德裏克執行

$sql = $con->query("UPDATE schedule SET participants='{$participants_new}' where date='{$date}'"); 

之前,以取代舊的參與者字符串琳達不會得到一個包含弗雷德裏克的字符串,她會得到「薩拉」:「理查德」:「格雷格」。而當她增添了她的名字就會看起來像「‘薩拉’:‘理查德’:'格雷格:「琳達」,當她更新數據庫這樣

$sql = $con->query("UPDATE schedule SET participants='{$participants_new}' where date='{$date}'"); 

字符串包括弗雷德裏克(」」 Sara':'Richard':'Greg':'Fredrik')將被(''Sara':'Richard':'Greg':'Linda'')覆蓋,沒有人會知道Fredrik在課堂上註冊。

因此,我如何重寫這段代碼,以便在Linda的查詢開始之前執行Fredrik的所有查詢?

+0

我喜歡這個問題。這是非常建築,並尋求解決物流問題。 – Webeng

+0

爲什麼你沒有添加每行參與者?相反,你將所有的學生保存在一個行中?由於您已經知道如果所有用戶都添加到一個字符串中,您應該爲每個用戶分別記錄這一問題,這不是一個好的做法,因此不可能同時將多個值同時添加到同一個字符串中。 。!其中一些將失蹤..! –

+0

您需要添加另一個表,將參與者鏈接到日程安排,但這不是將信息存儲在數據庫中的好方法,因爲您無法輕鬆搜索,過濾或加入信息。 – jeroen

回答

0

這裏是做的方法是:

Theoritically說明:

像這樣的東西可以當用戶執行查詢,因此應該檢查一次有人要求更新查詢work.That每次所以,現在用戶請求更新查詢之間必須有時間差。

注:它仍然不能保證它會成功的,因爲當你將有網絡問題,誰提交的在第一,但其互聯網問題的請求的用戶,這就是爲什麼他的更新查詢執行過程中的時間延遲另一個用戶來了,他發送請求延遲更新查詢,但他沒有互聯網連接問題,所以他的查詢將更新之前,我認爲這樣,第一個用戶查詢將失敗..!

這裏是代碼:

<?php 
// You need to add another column for saving time of last query execution 

$current_time=time(); 
$current_date=date("Y-m-d",$t); 
$query_execution_new_time = $current_time.":".$current_date; 

if (empty($row_schedule['query_execution_time'])) { 
$sql = $con->query("UPDATE schedule SET query_execution_time='{$query_execution_new_time}' where date='{$date}'"); 
} else { 
$query_execution_time = explode(":",$row_schedule['query_execution_time']); 
if ($query_execution_time[0] < $current_time) { 
$con->query("UPDATE schedule SET participants='{$participants_new}' where date='{$date}'"); 
$sql = $con->query("UPDATE schedule SET query_execution_time='{$query_execution_new_time}' where date='{$date}'"); 
} 
} 
?> 
-1

試試這個

無需首先獲取所有與會者,然後更新。 只更新新的參與者用戶。

您可以連接保存在數據庫列字段中的前一個結果的連接結果。


update schedule 
set participants = case when participants is null or participants ='' 

then CONCAT(participants,'Fredrik') // assume Fredrik a new participant 
else CONCAT(participants,':','Fredrik') 
end 
where date='$date'; 

即使你有多個參與者這樣就在同一時間的查詢不會在完全相同的時間運行,所以你會得到在最後正確的用戶。

你不需要擔心多個用戶點擊它們,除非你有上百萬用戶的

0

你提的問題很好的例子,說明爲什麼每個人都應該學會數據庫設計基礎,並始終遵循他們。

數據庫中由分隔符分隔的字符串是一個致命的錯誤。出於很多原因,但我們在這個特殊情況下很有趣。

如果您正確設計了數據庫,將參與者添加到單獨的行中,則不會有任何問題。

因此,只需通過添加與參與者的表來更改您的設計,並且不會添加或刪除任何數量的問題。