一、PHP連接數據庫及基本操作
MySQL采用的是'客戶機/服務器'架構。使用PHP安裝的MySQL擴展函數,和直接使用客戶端軟件區訪問MySQL數據庫服務器,原理一樣,都需要向MySQL管理系統發送SQL命令,然後將結果返回給用戶。
在PHP中,SQL分為兩類(查看SQL語句分類):一是有返回結果集的DQL語句,如select/desc 表名,執行完畢之後,需要PHP處理結果集;二是沒有結果集的,如DML、DDL等,但是DML語句執行成功後對數據表的記錄有影響。
<?php
//連接數據庫,常用參數是主機名、用戶名和密碼
$link = mysql_connect('localhost','root','123456');
//判斷是否連接成功
if(!$link)
{
die('連接失敗'.mysql.error()); //連接成功返回資源標識符,失敗返回false,mysql_error顯示錯誤信息
}
//選擇數據庫,mysql_error()只在調試中使用,再部署項目時就不要了,不然會洩露數據庫信息
mysql_select_db('test') or die('選擇數據庫失敗'.mysql_error());
//mysql_query()可以設置字符集和執行SQL語句
mysql_query('set names utf-8');
$sql = 'insert into test(id,name) values("1","dwqs")';
$result = mysql_query($sql); //執行sql返回結果集
//處理結果集,insert屬於DML,會對表的記錄有影響
if($result && mysql_affected_rows() > 0)
{
//mysql_insert_id()返回最後一條新紀錄的auto_increment值
echo '插入數據成功'.mysql_insert_id().'<br/>';
}
else
{
echo '插入數據失敗,錯誤號:'.mysql_errno().'錯誤信息:'.mysql_error().'<br/>';
}
//關閉連接
mysql_close($link);
?>
二、PHP處理select查詢結果集
在PHP中執行select語句返回一個結果集,可以用於對各個字段的處理
$result = mysql_query('select * from test');
//獲取記錄行的個數
$rows = mysql_num_rows($result);
//獲取字段個數,即數據列
$cols = mysql_num_fields($result);
如果需要訪問結果集中的數據,可以使用下列四個函數中的一個(均以結果集資源符作為參數,並自動返回下一條記錄,在表末尾時返回false)
1、mysql_fetch_row():該函數將一條結果記錄返回並以一個普通的索引數據保存
2、mysql_fetch_assoc():從結果集中取得一行作為關聯數據保存
3、mysql_fetch_array():從結果集中取得一行作為關聯數組,或數字數組,或二者兼有。可以使用MYSQL_ASSOC(關聯數組形式)、MYSQL_NUM(索引數組形式)和MYSQL_BOTH作為第二個參數,指定返回的數據形態。
4、mysql_fetch_object():從結果集中取得一行作為對象,各個字段以對象方式訪問。
建議:沒有特殊要求,不要使用mysql_fetch_array(),可以使用mysql_fetch_row()或者mysql_fetch_assoc()實現同樣的功能,且效率高。
另外也有三個與結果集相關的常用函數
5、mysql_data_seek(int $num):移動內部結果的指針,$num是想要設定的新的結果集指針的行數。
6、mysql_fetch_lengths(resource $result
):取得結果集中每個輸出的長度
7、mysql_result(resource $result
, int $row[,mixed $field]
):返回 MySQL 結果集中一個單元的內容。字段參數可以是字段的偏移量或者字段名,或者是字段表點字段名(tablename.fieldname)。如果給列起了別名('select foo as bar from…'),則用別名替代列名。調用 mysql_result()不能和其它處理結果集的函數混合調用。
mysql_fetch_array() 函數從結果集中取得一行作為關聯數組,或數字數組,或二者兼有。
返回根據從結果集取得的行生成的數組,如果沒有更多行則返回 false。
mysql_fetch_array(data,array_type)
參數data:可選。規定規定要使用的數據指針。該數據指針是 mysql_query() 函數產生的結果。
參數:array_type可選。規定返回哪種結果。該參數可選值:MYSQL_ASSOC - 關聯數組
MYSQL_NUM - 數字數組
MYSQL_BOTH - 默認。同時產生關聯和數字數組 。
注釋:mysql_fetch_array() 是 mysql_fetch_row() 的擴展版本。除了將數據以數字索引方式儲存在數組中之外,還可以將數據作為關聯索引儲存,用字段名作為鍵名。
例子:
<?php
$con = mysql_connect("localhost", "hello", "321");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
$db_selected = mysql_select_db("test_db",$con);
$sql = "SELECT * from Person WHERE Lastname='Adams'";
$result = mysql_query($sql,$con);
print_r(mysql_fetch_array($result));
mysql_close($con);
?>
輸出類似:
Array
(
[0] => Adams
[LastName] => Adams
[1] => John
[FirstName] => John
[2] => London
[City] => London
)
///////////////////////
mysql_fetch_assoc() 函數從結果集中取得一行作為關聯數組。
返回根據從結果集取得的行生成的關聯數組,如果沒有更多行,則返回 false。
mysql_fetch_assoc(data)
參數:data(必需)要使用的數據指針。該數據指針是從 mysql_query() 返回的結果。
注釋:mysql_fetch_assoc() 和用 mysql_fetch_array() 加上第二個可選參數 MYSQL_ASSOC 完全相同。它僅僅返回關聯數組。這也是 mysql_fetch_array() 初始的工作方式。
提示:如果在關聯索引之外還需要數字索引,用 mysql_fetch_array()。
注意:本函數返回的字段名是區分大小寫的。
例子如下:
<?php
$con = mysql_connect("localhost", "hello", "321");
if (!$con)
{
die('Could not connect: ' . mysq......余下全文>>
由於沒有看到完整的代碼,僅就看到的代碼試作解答如下:
1. Notice: Undefined variable: db in C:\xampp\htdocs\shop\files\mysql.php on line 5
警告:未字義的變量db(第5行不太清楚是哪行代碼)。
這個錯誤提示,從已知的代碼來看,其原因應該是你在函數體裡引用了一個函數體外定義的變量(db),從代碼看其實就是沒有注意到, 對於變量 作用域范圍(全局、局部)錯誤應用的問題。
簡單的說,函數 select_mycx 裡找不到 db。
解決辦法:
(1). 用參數傳遞進去。
function select_mycx($table,$by,$select_str,$number,$db)
{
.....
}
(2). 在參數體裡定義全局變量引用:
function select_mycx($table,$by,$select_str,$number)
{
global $db;
....
}
2.Fatal error: Call to a member function query() on a non-object in C:\xampp\htdocs\shop\files\mysql.php on line 5
這個錯誤實際上是上面的錯誤引起的,因為$db沒有正確引入,所以再 query 當然不能正確執行。