在上一篇使用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並進行控制的方法。
參考資料:
沒有留言:
張貼留言