-->

2013年4月21日 星期日

使用php及mysql使app具備連線網路資料庫(web database)的能力 (二) - 撰寫 php以 mysql管理資料庫

在上一篇使用php及mysql使app具備連線網路資料庫(web database)的能力 (一) - 建構資料庫,我們完成了資料庫的建置。本篇會針對如何以 php連線資料庫,進行查詢及新增資料。如果你是第一次接觸 php,可以到 codecademy這個互動式教學網站看看 php相關的入門課程,大約幾小時就能對 php有個大概的了解。


定義連線位址、資料庫名稱、使用者帳號及密碼

新增一個 config.php檔(筆者使用 eclipse進行 php的撰寫),並加入以下程式碼:

<?php
$server_config = array(
  'db' => array(
    'host'     => 'localhost',
    'dbname'   => 'myFirstDatabase',
    'username' => 'bowen',
    'password' => 'coolcoolcool',
  ),
);

筆者喜歡將環境參數與主程式分開,因此上述的程式碼,你也可以直接貼在等一下要撰寫的 .php檔中。

連線資料庫 - 新增資料(INSERT INTO)

新增 signUp.php,內容如下:

<?php
require_once 'config.php';
$config = $server_config['db'];

echo  "start<BR>";
//產生一個PDO(PHP Data Object)物件
$pdo = new PDO(
    'mysql:host=' . $config['host'] . ';dbname=' . $config['dbname'],
    $config['username'],
    $config['password']
    );
echo "new a object of PDO<BR>";

$nickname = "BOWEN_CHENG"; //設定nickname
$secret_code = "otherSecretCode";//設定secret_code
$pdo->beginTransaction();//開始提交任務 關閉自動提交
//產生一個自動帶入的物件
$sth = $pdo->prepare('INSERT INTO test_users (nickname, secret_code) VALUES (:nickname, :secret_code)');
echo "pdo prepare OK<BR>";
$sth->bindParam(':nickname', $nickname,PDO::PARAM_STR);//設定:nickname為$nickname並指定是str形式
$sth->bindParam(':secret_code', $secret_code,PDO::PARAM_STR);//設定:secret_code為$secret_code並指定是str形式
echo "pdo bindParam OK<BR>";
$sth->execute();//執行
if ($sth->errorCode()) {
 echo $sth->errorInfo() . "<BR>";
}
echo "pdo excute OK<BR>";
$pdo->commit();//提交
echo "pdo commit OK<BR>";
以下開始一行一行解釋程式碼:
require_once 'config.php';
$config = $server_config['db'];
為引用 config.php,並將變數 $config指定為 config.php中的 $server_config['db']。
$pdo = new PDO(
    'mysql:host=' . $config['host'] . ';dbname=' . $config['dbname'],
    $config['username'],
    $config['password']
    );

產生一個PDO物件,PDO類別是 PHP5之後才出現的,用來替代之前的 MySQL模組。PDO完整的內容可以參考這裡

$nickname = "BOWEN_CHENG"; //設定nickname
$secret_code = "otherSecretCode";//設定secret_code

設定要存到資料庫的 nickname及 secret_code。

$pdo->beginTransaction();//開始提交任務 關閉自動提交
//產生一個自動帶入的物件
$sth = $pdo->prepare('INSERT INTO test_users (nickname, secret_code) VALUES (:nickname, :secret_code)');
echo "pdo prepare OK<BR>";
$sth->bindParam(':nickname', $nickname,PDO::PARAM_STR);//設定:nickname為$nickname並指定是str形式
$sth->bindParam(':secret_code', $secret_code,PDO::PARAM_STR);//設定:secret_code為$secret_code並指定是str形式
echo "pdo bindParam OK<BR>";
$sth->execute();//執行
if ($sth->errorCode()) {
 echo $sth->errorInfo() . "<BR>";
}
echo "pdo excute OK<BR>";
$pdo->commit();//提交

開始一個提交的任務,關閉自動提交,並產生一個自動帶入物件,prepare詳細資訊可以參考這裡。而裡面的 "INSERT INTO test_users (nickname, secret_code) VALUES (:nickname, :secret_code)",是 mysql的語法。

至於後面的 ":nickname"及 ":secret_code"是要使用bindParam去取代。bindParam是綁定一個參數到指定的變數上,bindParam可參考這裡。綁定完之後,執行並提交。因此串程式碼結合起來,就是執行以下這段mysql語法:

INSERT INTO test_users (nickname, secret_code) VALUES ('BOWEN_CHENG', 'otherSecretCode')

執行 signUp.php你會得到以下結果:

到資料庫看看發生什麼事了,進入 phpMyAdmin -> Database -> myFirstDatabase -> test_users會發現你所設定的 nickname及 secret_code已經加入到資料庫裡面了。並且你應該也發現了,筆者資料庫裡面有兩個相同的nickname。因此,再輸入資料以前,必須先確認資料庫裡面是否已經存在相同的資料了。

連線資料庫 - 查詢(SELECT)

將 signUp.php修改如下:

";
//產生一個PDO(PHP Data Object)物件
$pdo = new PDO(
    'mysql:host=' . $config['host'] . ';dbname=' . $config['dbname'],
    $config['username'],
    $config['password']
    );
echo "new a object of PDO
";

$nickname = "BOWEN_CHENG"; //設定nickname
$secret_code = "otherSecretCode";//設定secret_code

$pdo->beginTransaction();//開始提交任務 關閉自動提交
//產生一個自動帶入的物件
$sth = $pdo->prepare('SELECT * FROM test_users WHERE nickname = :signUpId');
echo "pdo prepare OK
";
$sth->bindParam(':signUpId', $nickname,PDO::PARAM_STR);
echo "pdo bindParam OK
";
$sth->execute();//執行
if ($sth->errorCode()) {
 echo $sth->errorInfo() . "
";
}
echo "pdo excute OK
";

$pdo->commit();//提交
echo "pdo commit OK
";

$datas = $sth->fetch(PDO::FETCH_ASSOC);
if ($datas) {
 echo "isUsed";
}else {
 $pdo->beginTransaction();//開始提交任務 關閉自動提交
 //產生一個自動帶入的物件
 $sth = $pdo->prepare('INSERT INTO test_users (nickname, secret_code) VALUES (:nickname, :secret_code)');
 echo "pdo prepare OK
";
 $sth->bindParam(':nickname', $nickname,PDO::PARAM_STR);//設定:nickname為$nickname並指定是str形式
 $sth->bindParam(':secret_code', $secret_code,PDO::PARAM_STR);//設定:secret_code為$secret_code並指定是str形式
 echo "pdo bindParam OK
";
 $sth->execute();//執行
 if ($sth->errorCode()) {
  echo $sth->errorInfo() . "
";
 }
 echo "pdo excute OK
";
 $pdo->commit();//提交
 echo "pdo commit OK
";
}
$pdo->beginTransaction();//開始提交任務 關閉自動提交
//產生一個自動帶入的物件
$sth = $pdo->prepare('SELECT * FROM test_users WHERE nickname = :signUpId');
echo "pdo prepare OK
";
$sth->bindParam(':signUpId', $nickname,PDO::PARAM_STR);
echo "pdo bindParam OK
";
$sth->execute();//執行
if ($sth->errorCode()) {
 echo $sth->errorInfo() . "
";
}
echo "pdo excute OK
";

$pdo->commit();//提交
echo "pdo commit OK
";

修改內容是將以上程式碼加入到原本程式碼的15-16行之間,這段程式碼大同小異,主要是修改mysql語法為查詢資料庫中,是否有存在相同的 nickname。

$datas = $sth->fetch(PDO::FETCH_ASSOC);
if ($datas) {
 echo "isUsed";
}else {
...
}

並將原本新增資料的程式碼,放到else {...}中,fetch會以array回傳結果,fetch的詳細資訊可參考這裡。因此,若結果存在的話,表示具有相同的 nickname,則不能進行資料的新增,反之則可。

現在,再執行一次signUp.php,最後一行會出現"isUsed"。現在,我們已經能夠使用 php對資料庫進行連線,並新增及查詢資料了。最後,使用php及mysql使app具備連線網路資料庫(web database)的能力 (三) - 撰寫 app連線 php會告訴大家如何使app 具備連線 php並進行控制的方法。

參考資料:

http://www.php.net/

http://www.codecademy.com/zh#!/exercises/0

http://www.eclipse.org/downloads/

沒有留言:

張貼留言