[公告] 痞客豐年終!萬元禮券限量送~[公告] 第一屆痞客邦金點賞登場!2014年最有影響力的部落格即將揭曉[公告] 痞客邦新服務上線 每日星座運勢測算【得獎名單公佈】[公告] 痞客邦應用市集全新改版![公告] 痞客邦「應用市集」新 App 上架-iFontCloud Professional

這邊有個php mysql 教學的網站

http://www.php-mysql-tutorial.com/

用php+mysql也是行之有年了...

紀錄一下在php內怎麼使用mysql相關語法

 

一開始剛學php的時候

只是很簡單的使用php內建的mysql_connect指令

 

簡單直覺的方式

<?php
    $dbhost = '127.0.0.1';
    $dbuser = 'mysql_user';
    $dbpass = 'mysql_password';
    $dbname = 'mysql_databaseName';
    $conn = mysql_connect($dbhost, $dbuser, $dbpass) or die('Error with MySQL connection');
    mysql_query("SET NAMES 'utf8'");
    mysql_select_db($dbname);
    $sql = "SELECT COUNT(*) as total FROM `FileList` WHERE `class` = 0;";
    $result = mysql_query($sql) or die('MySQL query error');
    while($row = mysql_fetch_array($result)){
        echo $row['name'];
    }
?>

 

其中以下四個變數是要設定你的mysql相關設定

    $dbhost = '127.0.0.1';
    $dbuser = 'mysql_user';
    $dbpass = 'mysql_password';
    $dbname = 'mysql_databaseName';

 

這邊就是建立連線

    $conn = mysql_connect($dbhost, $dbuser, $dbpass) or die('Error with MySQL connection');

 

設定相關的編碼和選擇要使用的資料庫

    mysql_query("SET NAMES 'utf-8'");
    mysql_select_db($dbname);

 

接著就準備開始使用mysql的語法了

    $sql = "SELECT COUNT(*) as total FROM `FileList` WHERE `class` = 0;";
    $result = mysql_query($sql) or die('MySQL query error');
    while($row = mysql_fetch_array($result)){
        echo $row['name'];
    }

 

先用$sql紀錄語法,接著丟到mysql_query($sql)

這函式就會把$sql的語法丟到mysql讓他去執行

然後利用$result = mysql_query($sql)去得到回傳的結果

根據sql語法回傳的資料結構也不一樣

若是最一般的select語法則可以利用while迴圈和mysql_fetch_array去拿到資料

 

以上是最簡單的php mysql語法

但是後來發現如果一個php file裡面要存取多次database或是存取不只一個database

就會非常麻煩

所以我就改用了物件導向的方式

在此感謝NTUCSIE IRLab的健文學長

教導小弟使用php class...受益良多!!

 

物件導向的方式

通常我會寫兩個檔案,一個是DB_config.php,另外一個是DB_class.php

 

DB_config.php就是很簡單的設定database的位址、username、password以及使用的資料表

<?php
    global $_DB;	
    $_DB['host'] = "localhost";
    $_DB['username'] = "username";
    $_DB['password'] = "password";
    $_DB['dbname'] = "db_name";
?>

 

另外再寫一個DB_Class.php檔

<?php

class DB 
{
    var $_dbConn = 0;
    var $_queryResource = 0;
    
    function DB()
    {
        //do nothing
    }
    
    function connect_db($host, $user, $pwd, $dbname)
    {
        $dbConn = mysql_connect($host, $user, $pwd);
        if (! $dbConn)
            die ("MySQL Connect Error");
        mysql_query("SET NAMES utf8");
        if (! mysql_select_db($dbname, $dbConn))
            die ("MySQL Select DB Error");
        $this->_dbConn = $dbConn;
        return true;
    }
    
    function query($sql)
    {
        if (! $queryResource = mysql_query($sql, $this->_dbConn))
            die ("MySQL Query Error");
        $this->_queryResource = $queryResource;
        return $queryResource;        
    }
    
    /** Get array return by MySQL */
    function fetch_array()
    {
        return mysql_fetch_array($this->_queryResource, MYSQL_ASSOC);
    }
    
    function get_num_rows()
    {
        return mysql_num_rows($this->_queryResource);
    }

    /** Get the cuurent id */    
    function get_insert_id()
    {
        return mysql_insert_id($this->_dbConn);
    } 
    
}
?>

 

 

最後在要使用mysql的php file裡面

<?php
    require_once("DB_config.php");
    require_once("DB_class.php");

    $db = new DB();
    $db->connect_db($_DB['host'], $_DB['username'], $_DB['password'], $_DB['dbname']);
    $db->query("SELECT ....");
    while($result = $db->fetch_array())
    {
        // do something you want...
    }
?>

Posted by austintodo at 痞客邦 PIXNET 留言(27) 引用(1) 人氣()


open trackbacks list Trackbacks (1)

  • カシオ 時計

    php - MySQL 教學 @ [todo Austin] 奧斯丁。土豆 :: 痞客邦 PIXNET ::

留言列表 (27)

Post Comment
  • james
  • 不好意思,請問最後要如何輸出資料

    不好意思,小弟是php新手
    請問我SELECT ....資料後
    直接在// do something you want...輸入
    echo $result['article_title_tw'].'<br/>';
    但為何沒有資料紀錄輸出
    但資料表確實是有資料的
    謝謝
  • 也許你可以先利用print_r($result)看看result的詳細內容後在試試看!

    austintodo replied in 2010/03/31 21:48

  • james
  • 沒有輸出任何資料耶@@
    也沒有錯誤訊息
    空白一片>_<
  • 也許檢查看看你的SELECT語法有沒有問題@@?
    你的select寫什麼??

    austintodo replied in 2010/04/02 20:38

  • Mosquito

  • require_once("DB.class.php");
    這行改成
    require_once("DB_class.php");
    應該可以解決問題
  • 喔喔不好意思小弟筆誤了!
    已修正,感謝M大的更正

    已統一將DB.class.php改正成DB_class.php
    希望沒有造成大家的困擾orz

    austintodo replied in 2010/04/09 11:12

  • james
  • 謝謝站長
    真的可以了耶^^"
  • Victor
  • 請問...我使用簡單直覺的方法可以抓到資料,用物件導向的方式卻沒辦法讀取,請問有人跟我遇到相同狀況嗎= =?
  • 把你的code po出來看看@@?

    austintodo replied in 2010/04/21 15:28

  • Private Comment
  • Private Comment
  • victer367899
  • 啊...我解決了,是最基本的錯誤:檔案名稱大小寫問題。
    我命名成了DB_Config.php, DB_Class.php 囧
  • 路人
  • 這....恕小弟才疏學淺
    不理解把這些語法寫近class裡面的好處到底在哪....|||
    可以解釋一下嗎???
  • 我回再下面一篇@@

    austintodo replied in 2010/05/12 16:03

  • austintodo
  • 其實相關的概念可以去搜尋 "物件導向" "Object Oriented" 之類的關鍵字
    這邊簡單舉幾個使用class的好處@@
    詳細的概念以及使用方法可以google到好多好多

    1. 當你得連到好幾台database server時
    物件的最大好處就是reuse (重複使用)
    所以我可以透過同樣的class
    但是使用不同的設定檔
    $db1 = new DB($host1, $user1, $pass1);
    $db2 = new DB($host2, $user2, $pass2);
    這樣就可去同時使用兩個database 又不會干擾

    2. 當有可能會更換database system時
    雖然這邊講的是php+mysql
    但其實php也可以跟pgsql ... 等其他的database system
    (當然php的語法就會有點不同)

    但我今天如果把跟database相關的處理弄成class
    以後只要是要資料
    程式部分只要呼叫 $db->query("SELECT * ... ")就好了
    $db這個class要負責把sql語法丟到資料庫然後回傳結果

    於是,如果今天老闆臨時說:我今天要把系統換成pgsql
    我就可以很快速的
    a) 新寫一個pgsql_database.class然後去繼承原本的database.class
    然後override需要修改的method (像是把原本的mysql_query部份改成pgsql_query)

    b) 把原本的$db = new DB() 改成 $db = new PGSqlDB()

    其他都不用動
    一切都可以正常繼續

    除此之外還有很多好處
    但我明天要交作業所以先說到這邊..XD
    改天有空再補上來@@

    但欲罷不能 再講個這邊看不到到的"好處"好了

    其實現在要做跟資料庫相關的網頁其實危險性很高
    舉個例子
    上面的insert對於要insert什麼資料完全沒有任何篩選
    所以如果今天user輸入的資料是 "<ifreame> ... </iframe>"
    那麼資料庫就會乖乖的存 <iframe> ... </iframe>
    那麼下次另外一個user讀到網頁時
    select出來的data就會是<iframe>...</iframe>
    可想而知你的網頁就被破壞了
    (這個概念的關鍵字:sql injection)
    所以比較好的寫法就是把database相關的access寫到一個class裡面
    然後在insert的相關部分都處理一下(通常是escape一些有的沒的)
    所以程式端就不用擔心了!

    class的好處其實說不完
    就像這邊講的
    A computer language is object-oriented if they support the four specific object properties called abstraction, polymorphism, inheritance, and encapsulation
    要把這四個概念融會貫通
    大學都得開一學期的課了XD
    (是說我也還沒融會貫通QQ)

    以上供你參考
  • eit
  • 問題

    你好,首先感謝你分享這篇文章,關於上面網友提到印出一片白...
    我trace了兩天終於抓到問題所在

    mysql_query("SET NAME 'utf-8");

    應該要改成

    mysql_query("SET NAMES 'utf8'");

    所以一共有三個錯誤
    1. NAME要加上S
    2. utf8中間不能加上 -
    3. 8後面少加一個 '

    供大家參考
  • 感謝! 已修正!

    austintodo replied in 2010/09/13 16:28

  • 司徒
  • 請問為什麼我一直出現MySQL Query Error訊息?
  • 司徒
  • 我是搭配SWFUpload寫的可是回應訊息確是MySQL Query Error是那裡錯了嗎??
  • 無知者
  • 您好..我想詢問一下..這樣db還需要close嗎?
  • adt1031
  • 不好意思想請問一下我照您所說的
    $dbhost = '127.0.0.1';
    $dbuser = 'root';
    $dbpass = '1234';
    $dbname = 'testdb';
    $conn = mysql_connect($dbhost, $dbuser, $dbpass) or die('Error with MySQL connection');
    mysql_query("SET NAMES 'utf8'");
    mysql_select_db($dbname);

    到$dbname = 'testdb';都還可以執行但加上
    $conn那段之後網頁就變成一片空白了
    是有甚麼問題嗎~?
  • 可能要檢驗看看你的connect有沒有成功
    die()是將錯誤訊息已stdout的方式印出
    如果你是用網頁debug的話
    可以改成下面這個方法看看
    $conn = mysql_connect($dbhost, $dbuser, $dbpass)
    if (!$conn) {
    echo "mysql connect error: " . mysql_error() );
    }

    austintodo replied in 2012/05/17 14:15

  • adt1031
  • 因為剛開始學有沒有其他比較好的debug方法呢~因為我用網頁的照您上面說的
    沒有echo出訊息,還是一樣一片空白~
  • 若是照上面的設定
    connection成功以後就是維持住connection
    正常情況下網頁不會印出任何東西的!
    你可以開始使用一些sql來拿資料以後
    透過echo或是print印出sql後的結果!

    austintodo replied in 2012/05/17 15:11

  • adt1031
  • $dbhost = '127.0.0.1';
    $dbuser = 'root';
    $dbpass = '1234';
    $dbname = 'test_db';
    $conn = mysql_connect($dbhost, $dbuser, $dbpass) or die('Error with MySQL connection');
    mysql_query("SET NAMES 'utf8'");
    mysql_select_db($dbname);
    $conn = mysql_connect($dbhost, $dbuser, $dbpass)
    if (!$conn) {
    echo "mysql connect error: " . mysql_error() );
    }
    echo "test"
    ======================
    "test"也沒也echo出來呢....
  • adt1031
  • 可以連線成功了,謝謝指導~~
    但是還在看怎麼讓中文資料進入mysql時不會亂碼
  • fit
  • 可否示範怎樣用DB_class.php裡面的function,不是很明白那些使用方法。
  • 新手
  • 請問一下
    我網頁上顯示出來
    connect_db($_DB['host'], $_DB['username'], $_DB['password'], $_DB['dbname']); $db->query("SELECT Name FROM test"); while($result = $db->fetch_array()) { print_r($result); } ?>

    $db-> 之後全部變成顯示出來
    這邊要怎麼修改QQ
  • 新手
  • 我發現我的php 再html裡面

    用網頁 按原始碼時
    一律都是被註解掉的
    <!-- --> 被這個註解掉
  • a student
  • 板主您好:

    以下的程式碼:


    <?php
    $hostname_conn_haha = "localhost";
    $database_conn_haha = "haha";
    $username_conn_haha = "root";
    $password_conn_haha = "123456s";
    $conn_haha = mysql_pconnect($hostname_conn_haha, $username_conn_haha, $password_conn_haha) or trigger_error(mysql_error(),E_USER_ERROR);
    mysql_query("SET NAMES 'UTF8'");
    ?>
    <?php
    // to login .
    if (!isset($_SESSION)) {
    session_start();
    }

    $loginFormAction = $_SERVER['PHP_SELF'];
    if (isset($_GET['accesscheck'])) {
    $_SESSION['PrevUrl'] = $_GET['accesscheck'];
    }

    if (isset($_POST['name'])) {
    $loginUsername=$_POST['name'];
    $password=$_POST['name'];
    $MM_fldUserAuthorization = "";
    $MM_redirectLoginSuccess = "index.php";
    $MM_redirectLoginFailed = "index.php?Error";
    $MM_redirecttoReferrer = false;
    mysql_select_db($database_conn_biobank, $conn_biobank);

    $LoginRS__query=sprintf("SELECT name, phone FROM abc WHERE name=%s AND phone=%s",
    GetSQLValueString($loginUsername, "text"), GetSQLValueString($password, "text"));

    $LoginRS = mysql_query($LoginRS__query, $conn_biobank) or die(mysql_error());
    $loginFoundUser = mysql_num_rows($LoginRS);
    if ($loginFoundUser) {
    $loginStrGroup = "";

    //session
    $_SESSION['MM_Username'] = $loginUsername;
    $_SESSION['MM_UserGroup'] = $loginStrGroup;

    if (isset($_SESSION['PrevUrl']) && false) {
    $MM_redirectLoginSuccess = $_SESSION['PrevUrl'];
    }
    header("Location: " . $MM_redirectLoginSuccess );
    }
    else {
    header("Location: ". $MM_redirectLoginFailed );
    }
    }
    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>ThePoint</title>
    </head>

    <body>
    <form id="form1" name="form1" method="post" action="">
    <p>
    <label for="name">姓名</label>
    <input type="text" name="name" id="name" />
    </p>
    <p>
    <label for="phone">手機</label>
    <input type="text" name="phone" id="phone" />
    </p>
    <p>
    <input type="submit" name="confirm" id="confirm" value="送出" />

    <input type="submit" name="reset" id="reset" value="重置" />
    </p>
    </form>
    </body>
    </html>
    -------------------------------------------------
    如果希望使用者在網頁上打入姓名與手機兩行資料後,資料可以直接寫入abc資料表內的話!

    請問還需要加入那些php語法? 謝謝!

    -----------------------------------------------------
    在這裏假設我要連的
    資料庫是叫做:haha
    mysql user假設為:root
    資料庫密碼為:123456
    table叫做:abc
    ------------------------------------------------
    ^_^
  • 天秤女~佳佳
  • 我也是新手

    php 沒註冊 導向
    正在寫~~~
    你會串接嗎
  • 天秤女~佳佳
  • 你好強喔
    我現在就撈兩個不同主機的資料庫
    1次好幾個資料表
    真麻煩
  • 訪客
  • 可能只能連自已的電腦, 但實際上真正網上SERVER 我試過連不到... 也不太明白樓主做什麼... 是不是打開DREAMWEAVER 照抄, 改寫login 資料, 但上傳後什麼也沒有。。
  • Private Comment
  • Private Comment

You haven’t logged in yet, please use guest status to leave message. You can also log in with above service account and leave message

other options