2012-12-06 63 views
0

有人問我這個面試問題,所以以爲我會張貼在這裏,看看其他用戶會如何回答:PHP/MySQL面試 - 您將如何回答?

Please write some code which connects to a MySQL database (any host/user/pass), retrieves the current date & time from the database, compares it to the current date & time on the local server (i.e. where the application is running), and reports on the difference. The reporting aspect should be a simple HTML page, so that in theory this script can be put on a web server, set to point to a particular database server, and it would tell us whether the two servers’ times are in sync (or close to being in sync).

這是我提出:

// Connect to database server 
$dbhost = 'localhost'; 
$dbuser = 'xxx'; 
$dbpass = 'xxx'; 
$dbname = 'xxx'; 

$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die (mysql_error()); 

// Select database 
mysql_select_db($dbname) or die(mysql_error()); 

// Retrieve the current time from the database server 
$sql = 'SELECT NOW() AS db_server_time'; 

// Execute the query 
$result = mysql_query($sql) or die(mysql_error()); 

// Since query has now completed, get the time of the web server 
$php_server_time = date("Y-m-d h:m:s"); 

// Store query results in an array 
$row = mysql_fetch_array($result); 

// Retrieve time result from the array 
$db_server_time = $row['db_server_time']; 

echo $db_server_time . '<br />'; 
echo $php_server_time; 

if ($php_server_time != $db_server_time) { 
    // Server times are not identical 

    echo '<p>Database server and web server are not in sync!</p>'; 

    // Convert the time stamps into seconds since 01/01/1970 
    $php_seconds = strtotime($php_server_time); 
    $sql_seconds = strtotime($db_server_time); 

    // Subtract smaller number from biggest number to avoid getting a negative result 
    if ($php_seconds > $sql_seconds) { 
     $time_difference = $php_seconds - $sql_seconds; 
    } 
    else { 
     $time_difference = $sql_seconds - $php_seconds; 
    } 

    // convert the time difference in seconds to a formatted string displaying hours, minutes and seconds 
    $nice_time_difference = gmdate("H:i:s", $time_difference); 

    echo '<p>Time difference between the servers is ' . $nice_time_difference; 
} 
else { 
    // Timestamps are exactly the same 
    echo '<p>Database server and web server are in sync with each other!</p>'; 
} 

是的,我知道,我已經使用了不推薦使用的mysql_ *函數,但是除此之外,你會如何回答,即你會做出什麼改變,爲什麼?我應該考慮哪些因素被忽略?

有趣的是,我的成績似乎總是分鐘的一個確切的數字分開時,我的託管帳戶執行:

2012-12-06 11:47:07

2012-12-06 11:12:07

+2

如果我是面試官,我也不會叫你回來:-) –

+2

使用的DateTime對象,並DateTimeInterval;一點OOP;異常處理db –

+0

謝謝Jack .... – martincarlin87

回答

3

這將是我的代碼大部分:

$db = new PDO(...); 
$dbTime = new DateTime(current($db->query('SELECT NOW()')->fetchAll(PDO::FETCH_COLUMN, 0))); 
$myTime = new DateTime(); 
$diff = $myTime->diff($dbTime); 
// do stuff with $diff 
1

您handwave了你的過時的使用mysql_職能,但如果我在求職面試中問這個問題,那就是紅旗#1。它會告訴我要麼你沒有跟上PHP的當前最佳實踐,要麼你不在乎。

另一件我會關心的代碼段是你沒有指定MySQL給你的時間格式。我想明確指定輸出格式,以便你不依賴任何服務器設置。

+1

感謝Andy,只是在我目前的角色中,它仍然是'my_sql_ *',所以我還沒有機會使用PDO,因此也沒有記住它們,但我同意你的看法。關於你的第二點,你將如何指定MySQL返回的時間格式? – martincarlin87

+0

時間格式可以更改嗎? = O –

+0

我不使用MySQL,但我假設你會使用'DATE_FORMAT'函數,我發現[本頁](http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html)通過谷歌搜索「MySQL日期格式」。 –

2
$php_server_time = date("Y-m-d h:m:s"); 

會將時間格式設置爲年 - 月 - 日 - 小時:月:秒。這解釋了服務器時間似乎爲11:12:07的事實。它實際上說它是十二月。數據庫時間和服務器時間恰好相差35分鐘將是非常令人驚訝的是。即使沒有「完全」這個詞也是令人驚訝的。

分鐘是格式字符串中的i


除此之外,時間相差一秒並不意味着數據庫與服務器完全同步。這可能意味着測量之間已經過了一些(任意小的)時間。如果要驗證同步,可以在服務器上進行兩次測量,一次在查詢前,一次在查詢後進行範圍比較,或者簡單地進行delta比較(abs(t1-t2)< = 1s)

+0

哎呀,我的錯誤,是一個錯字,感謝您的注意! – martincarlin87

+0

@ martincarlin87奇怪的是,你懷疑打字錯誤的後果,表明錯字實際上是在你的測試代碼中。 –

+0

是的,我從內存創建測試代碼,所以它在測試用例中運行,但我沒有提交與該錯字是我的意思。 – martincarlin87

0

會用PDO和查詢:

SELECT UNIX_TIMESTAMP() 

代碼:

$time_difference = abs($PDOStatement->fetchColumn() - date('U')); 

,可能將宣佈時間「大致相同」時,不同的是<= 1