2013-03-13 22 views
1

中聲明一個函數作爲變量我開始學習php和我的問題,理解在很多情況下函數被定義爲變量。任何人都可以解釋我它是什麼和例子背後的實際目的:爲什麼在php

$db_name= "testdb"; 
$table_name= "my_music"; 
// below we create the connection to the database. 
$connection= @mysql_connect("localhost", "myusername", "mypassword") or die(mysql_error()); 
// below we are gonna define what database to connect. 

$db= @mysql_select_db($db_name, $connection) or die(mysql_error()); 

//below creates the sql statement so it can insert the data into the table. 

$sql= " 
INSERT INTO $table_name 
(format, title, artist_fn, artist_ln, rec_label, my_notes, date_acq) 
VALUES 
('$format', '$title', '$artist_fn', '$artist_ln', '$rec_label', '$my_notes', '$date_acq')"; 

//below is the function that holds the result of the query function 
$result= @mysql_query($sql, $connection) or die(mysql_error()); 
// end of the php for inserting data into database. 
?> 

正如你在這裏看到的$db是不以任何下列代碼使用這個代碼是完全連接到數據庫,並做的工作。什麼是替代方式來幫助我更好地理解它。我一直在網上搜索,但找不到任何有用的答案 在此先感謝。

+3

以學習[PDO](http://php.net/pdo)開始。 – 2013-03-13 07:53:40

+3

這不是「將函數聲明爲變量」,它只是將函數的返回值賦給變量。顯然這是沒有必要的,因爲它從來沒有用過,就像你說的那樣。 – deceze 2013-03-13 07:55:31

+0

你有什麼具體的不明白?你能說出來嗎? – hakre 2013-03-13 07:56:42

回答

3

序言:mysql擴展標記爲已棄用。對於新的腳本和esp。得知PHP /數據庫的東西,請選擇另一個MySQL API時,看到http://docs.php.net/mysqlinfo.api.choosing


分配給$dbmysql_connect()返回值是不是一個功能,但MySQL連接資源。您可以並且應該將它傳遞給後續調用mysql_select_db(..., $db),mysql_real_escape_string(..., $db),mysql_query(..., $db),mysql_error($db)(除了直接在mysql_connect之後)等。
由mysql_connect建立的最後一個連接存儲在擴展中的「內部」。如果在撥打電話時離開鏈接參數, mysql_query()擴展將使用最後一次連接。但是,如果沒有存儲有效的鏈接,它也「允許」分機建立新的默認連接,請參見mysql.default_*,網址爲http://docs.php.net/mysql.configuration
因此,例如如果你有一個腳本沒有正確的錯誤處理和不通過鏈路資源的後續函數調用像

<?php 
mysql_connect('server1', ..., ...); 
mysql_select_db('somedatabase'); 
mysql_query('INSERT INTO ....'); 

它可能實際上是「工作」,而是把數據放到不同的MySQL服務器比你打算做的事。
因此,總是要安裝適當的錯誤處理(無論您的上下文中的「正確」意味着什麼),並始終將鏈接資源傳遞給mysql_ *函數。

<?php 
checkParameters() or onParameterError(); 
$db = mysql_connect('server1', ..., ...) or onMyErrorHandler(null); 
mysql_select_db('somedatabase', $db) or onMyErrorHandler($db); 
$param = mysql_real_escape_string($_POST['value'], $db); 
$result = mysql_query('INSERT INTO ....', $db) or onMyErrorHandler($db); 
+0

不需要使用虛構的onMyErrorHandler()。使用trigger_error()代替。它會更好地爲您服務 – 2013-03-13 08:07:39

+0

感謝您的意見:我會補充一點,實際的錯誤處理是另一個話題(一個人可以寫一本書......哦,等等,人們在這個問題上寫下書籍; - ))並沒有在這裏介紹。我非常想知道不想把那些平常的或死的DIE教程快捷方式放在那裏。 – VolkerK 2013-03-13 08:15:35

3
$db= @mysql_select_db($db_name, $connection) or die(mysql_error()); 

在這裏,mysql_select_db()(布爾值)的結果爲分配給這裏$db。正如你理所當然地指出,它沒有繼續使用下來的代碼,因此該語句可以寫成:

@mysql_select_db($db_name, $connection) or die(mysql_error()); 

注意,不推薦使用error control operator的,瞭解error logging以及如何避免這些or die()結構體。

此外,不應該使用舊的mysql_函數;學習PDOmysqli會更好。