PHP 日本研討會 2024

MySQL 函式

注意事項

注意:

大多數 MySQL 函式接受 link_identifier 作為最後一個可選參數。如果沒有提供,則使用最後開啟的連線。如果不存在,則嘗試使用 php.ini 中定義的預設參數建立連線。如果失敗,函式會傳回 false

目錄

新增註記

使用者貢獻的註記 37 則註記

3
arnold_dba
17 年前
此外,為了保護 MySQL 資料並能夠符合 PCI 標準,您應該加密資料。有很多方法可以做到這一點。對於駭客,您可以使用 dm-crypt (www.saout.de/misc/dm-crypt) 工具。它基本上用於加密整個分割區。如果您想要複雜的解決方案,請使用來自 packet general (www.packetgeneral.com) 的 MySQL Security-GENERAL
在 Windows 上,您可以使用 Windows 本身提供的磁碟加密功能,或使用 tru crypt (www.truecrypt.org) 之類的工具
2
matiyahoo-publico at yhoo dot com dot ar
17 年前
David

在這行程式碼中

$query = "SELECT username FROM users WHERE username REGEXP '$username[0-9*]'";

PHP 可能會讀取 $username[, *包含* 開頭的方括號,並且可能認為您正在嘗試進入陣列。

您應該改用這個

$query = "SELECT username FROM users WHERE username REGEXP '${username}[0-9*]'";

或者可能是這個

$query = "SELECT username FROM users WHERE username REGEXP '$username" . "[0-9*]'";
1
php comments of fuzzyworm co., uk
18 年前
如果您想要讓 PHP 在 Windows 系統下與 MySQL 順利協同運作,即使是 Apache,請嘗試 Apache Friends 的 XAMPP。它省去了處理設定檔的麻煩,這是讓這三者在 Windows 下協同運作的唯一主要問題。

http://www.apachefriends.org/en/xampp-windows.html
1
Microsoul V3
19 年前
我使用 IIS 6、PHP 5.04、Windows Server 2003 和 MySQL 4.1.11。以下是我能夠弄清楚的內容。
為了讓 MySQL 和 PHP 相互溝通,在 php.cfg 中,別忘了開啟標籤
cgi.force_redirect = 0,並確保將其設定為 0(預設值為 1。只需從程式碼中的它前面刪除分號即可啟用它)。然後 phpinfo 將會說它正在從您的 PHP 安裝目錄而不是您的 WINDOWS 根目錄讀取 cfg。然後您的 phpinfo 將顯示某些人可能難以處理的 MySQL 條目。不需要登錄設定或複製任何內容。另請遵循使用者評論中其餘的出色幫助。這是我為了簡化它所做的事情
我在檔案樹中「程式檔案」的上一層(也就是瀏覽你的電腦)建立一個名為 PHP 的資料夾。我將 .zip 格式的 PHP 版本解壓縮到這個資料夾中(而不是自動安裝的版本)。我編輯了 php.ini-recommended,將其重新命名為 php,並加入我的 SQL 使用者名稱、資料庫名稱等。(你真的要仔細查看 cfg 檔案,確保沒有遺漏任何東西)。我啟用了 extension=php_mysql.dll(只需刪除前面的分號即可)。將 PHP 資料夾加入 PATH 環境變數中(如何操作的說明非常簡單,上面已經有文件說明)。我也將 ext 資料夾加入 PATH,但不確定是否真的有必要。使用者評論真的對我幫助很大,所以我認為我也應該回饋一下,並嘗試稍微擴展這個主題。
1
medic at setiherbipolis dot de
19 年前
客戶端不支援伺服器要求的驗證協定;請考慮升級 MySQL 客戶端

這表示你正在使用舊版本的 MySQL 客戶端 (可能不是 mysqli)

MySQL 的驗證協定已在 4.1 版中變更。

若要提示你正在使用哪個版本的 mysql 客戶端,請嘗試 phpinfo();
1
arjen at mysql dot com
19 年前
John Coggeshall 為仍使用舊 ext/mysql 函數的應用程式編寫了一個 PHP5 ext/mysqli 相容性腳本。這避免了嘗試在 PHP5 中同時載入 mysql 和 mysqli 擴展的麻煩,因為這可能很棘手。

該腳本位於
http://www.coggeshall.org/oss/mysql2i/
1
dhirendrak at yahoo dot com
16 年前
<?php
# 由 dhirendra 建立,聯絡方式為 dhirendrak at yahoo dot com
# 此腳本用於檢查兩個資料表之間的資料差異
# 條件是兩個資料表的結構相同。
# 限制:
# 1) 兩個資料表的結構應相同。
# 2) 兩個資料表的名稱應不同,但如果相同,則第二個資料表顯然
# 應位於不同的資料庫中。
# 3) 如果使用兩個資料庫,則兩個資料庫的權限應相同,
# 因為我使用別名來取得資訊。
#
# 用途:
# 1) 當你在現有的腳本中進行一些變更並期望獲得特定輸出時,這可能很有用。
# 因此,藉由此函數,你可以比較腳本變更造成的影響。
#
#

$host=""; # 主機名稱或 IP 位址
$user=""; # 資料庫使用者名稱
$pass=""; # 資料庫密碼
$database=""; # 您要連線的資料庫名稱

# 取得與 MySQL 的連線
$dblink = @mysql_connect($host,$user,$pass);

# 選擇並開啟資料庫
mysql_select_db($database,$dblink);

$db1="< 您的 db1 >"; // 第一個資料庫
// 如果兩個資料表的資料庫相同,則使用與 db1 相同的資料庫
$db2="< 您的 db2 >";
$table1="< 您的 table1 >"; // 第一個資料表
// 如果兩個資料表的資料庫相同,則資料表名稱
# 必須不同,但欄位名稱相同且欄位順序相同。

$table2="< 您的 table2 >";

// 函數從這裡開始
function table_data_difference($first,$second)
{
global
$dblink;
$sql1 = "SHOW FIELDS FROM $first";
$result = mysql_query($sql1,$dblink) or die("執行錯誤 1 ==".mysql_error());

while(
$row = mysql_fetch_object($result))
{
$from_fields[]=$row->Field;
}

$sql="select * from $first";
$res=mysql_query($sql,$dblink) or die("執行錯誤 2==".mysql_error());
$j=1;
while(
$row=mysql_fetch_array($res))
{

$num=count($from_fields);

$sql_next="select $second.* from $second where";

for(
$i=0;$i < $num;$i++)
{
$sql_next=$sql_next." ".$second.".".$from_fields[$i]."='".$row[$from_fields[$i]]."' and ";
}

$sql_next=substr($sql_next,0,strlen($sql_next)-5);

$res_next=mysql_query($sql_next,$dblink) or die("執行錯誤 3==".mysql_error());
$num1=mysql_num_rows($res_next);
if(
$num1==0)
{
for(
$i=0;$i < count($from_fields);$i++)
{
$val=$val."<br>".$from_fields[$i]."=".$row[$from_fields[$i]];
}
// 顯示不符合的記錄。
echo "<br>\n".$j.".".$val;
echo
"<br>-----------------------------------------------------";
$j++;
}

}

}

$first=$db1.'.'.$table1;
$second=$db2.'.'.$table2;

table_data_difference($first,$second);

?>
1
rad14701 at yahoo dot com
17 年前
@Amanda 2007年10月12日 09:58

我幾乎要問自己這是否是一個真實的問題了... 如果 MySQL 伺服器拒絕連線嘗試,那麼,是的,MySQL 將能夠傳回一個錯誤給 PHP... 如果 PHP 完全無法存取目標 MySQL 伺服器,那麼它也夠聰明可以自己發出適當的錯誤...
1
claude(at)claude(dot)nl
19 年前
關於資源的注意事項

當資源(例如,連結識別碼)超出範圍時,它會被刪除,且相關的電腦資源(例如,與資料庫的 tcp 連結)也會被終止。到目前為止,一切順利!
然而,在以下程式碼中,tcp mysql 連結會持續到執行結束
<?php
$conn
= mysql_connect('主機名稱', '使用者名稱','密碼');
$conn = null;
sleep (30);
?>
這是因為連結識別碼會在內部儲存,以便後續的 mysql 函數可以運作。似乎沒有辦法刪除這個內部參考。
然而,如果你開啟 2 個連線,最舊的連線會自動刪除(因此,與主機名稱的連線會在 $conn=null 陳述式終止,而與主機名稱2 的連線將存在到腳本結束)。
<?php
$conn
= mysql_connect('hostname', 'username','password');
$conn2 = mysql_connect('hostname2', 'username','password');
$conn = null;
$conn2 = null;
sleep (30);
?>
1
skelley at diff dot nl
23 年前
嗨,這裡有一個小技巧,可以在 3.23 版本之前的 MySQL 資料庫中,從資料表中隨機選擇記錄。

SELECT *, (ItemID/ItemID)*RAND() AS MyRandom FROM Items ORDER BY MyRandom

[編輯註記:在 3.23 版本之後,只需使用 "SELECT * FROM foo ORDER BY RAND()" 即可]
0
atk2 at hotmail dot com
17 年前
在新的 Windows XP 電腦上成功安裝 IIS、PHP 和 MySQL 後,我決定寫下我採取的步驟,讓您可以了解安裝過程:http://www.atksolutions.com/articles/install_php_mysql_iis.html

希望這對您有所幫助。
0
richard at NOSPAM dot dimax dot com
18 年前
回覆 Conrad Decker 下方的文章

如果您的資料表包含外鍵約束,您將無法從 mysqldump 建立的資料檔案正確還原。

mysqldump 會以字母順序而非外鍵約束所需的邏輯順序傾印資料表資料。
0
vbolshov at rbc dot ru
18 年前
我最近在設定與 MySQL 相關的 PHP 擴充功能時遇到問題(也就是 mysql 和 pdo_mysql)。後來我發現這不是 PHP 的問題,而是 MySQL 的問題 - libmysqlclient 沒有隨二進位下載提供。我從原始碼建置 MySQL,然後兩個擴充功能都順利編譯成功。
0
yp
18 年前
當使用 Fedora Core linux 安裝 Mysql rpm 時。
設定如下以載入 mysql 標頭檔。
./configure --with-mysql=/usr/
記住要在編譯前執行 make clean 來移除舊的設定
0
avis_del at yahoo dot com
19 年前
我同意 j at jonathany.com 的說法

PHP 5.04 到 MySQL,
php_mysql.dll 將不會在 Windows 安裝程式 (.msi) 中找到
只需從 .zip 檔案解壓縮(可以下載)。
它會正常運作。

1. cgi.force_redirect = 0
2. extension_dir = "c:\php\ext"
3. extension=php_mysql.dll

直到 phpinfo.php 顯示

MySQL Support enabled
Active Persistent Links 0
Active Links 0
Client API version 4.1.12
0
noel at nettensity dot com
19 年前
在 Windows Server 2003/IIS 6.0 上啟用 MySQL
首先找到您的 php.ini 檔案,檢查 phpinfo() 以查看 PHP 目前在哪裡尋找 php.ini。(例如,使用 PHP 5.0.4 的 Windows 安裝程式,php.ini 檔案會被放置在 C:\Windows 目錄中。)不過,我建議您不要使用安裝程式 - 請採用完整的手動安裝。

在 php.ini 中設定以下內容
display_errors = on
error_reporting = E_ALL
這將確保您會看到設定期間發生的任何錯誤。當您完成 php.ini 的設定後,請務必更正這些錯誤!請勿在正式環境的機器上保留這些設定。

在 php.ini 中設定以下內容
extension_dir = "擴充功能的路徑(通常是 [您的 php 路徑]\ext)"
extension=php_mysql.dll(如果它已在您的 php.ini 中,請確保取消註解)

在 IIS 中,開啟「網頁服務擴充功能」,按一下「新增網頁服務擴充功能...」
輸入 PHP 作為擴充功能名稱
在「必要檔案」下
新增 [您的 php 路徑]\php5isapi.dll
新增 [您的 php 路徑]\php5ts.dll
按一下「套用」,然後按一下「確定」

建立您通常會建立的網站,但請確保它們具有可執行權限,而不僅僅是腳本存取權限。在「首頁目錄」索引標籤下,按一下「設定」。捲動頂端的清單,看看是否能找到 PHP。如果可以,請確保 PHP 可執行檔的路徑正確。如果您在清單中找不到 PHP,請按一下「新增...」,然後瀏覽到正確的可執行檔,[您的 php 路徑]\php5isapi.dll,然後按一下「確定」。在擴充功能欄位中,輸入「PHP」。動詞應該已經設定為「所有動詞」,保持原樣。

使用此程式碼建立一個測試頁面
<? echo(phpinfo()); ?>
將它命名為 test.php,並將此檔案放入您剛剛建立的網站中。最好使用 Firefox 瀏覽該頁面,並確保您有一個包含一些 MySQL 資訊的 MySql 區段。如果沒有,則您的路徑可能搞砸了,或者您仍然沒有編輯正確的 php.ini(再次,請查看 phpinfo() 顯示的位置,如果有必要,請在那裡編輯,然後將其移動並重新設定)。

希望這對您有所幫助!
0
Anonymous
19 年前
如果您在 Windows 2003 伺服器(又名 Win 2k3)上安裝 PHP5,並且需要使用 php_mysql.dll 或 php_mysqli.dll 或兩者同時運作 MySQL,而且 MySQL 沒有顯示在 phpinfo 中,則您的 php.ini 可能沒有載入。在 PHP 5 zip 檔案的指示中,他們會告訴您將 PHP 安裝目錄新增到您的 Windows 路徑中。這應該會告訴 PHP 從哪裡載入其 php.ini,但它不會。如果您想讓它正常運作,您不必像大家建議的那樣將任何 DLL 複製到任何地方。您所要做的就是將以下登錄機碼新增到 Windows

[HKEY_LOCAL_MACHINE\SOFTWARE\PHP]
"IniFilePath"="C:\\PHP"

只需將上述 2 行程式碼複製到文字檔案中,並將檔案另存為 php_ini_path.reg

儲存檔案後,它看起來會像一個登錄檔案。只需按兩下它即可。

它會使 PHP 在 C:\PHP 中尋找您的 php.ini。我假設如果您將 PHP 安裝到不同的位置,您可以編輯此設定,但我沒有嘗試過。

執行 reg 檔案後,請確保您的 php.ini 位於您的 PHP 目錄中,並確保所有適當的項目都已設定。這應該可以讓您開始運作。請確保您也遵循所有關於如何在 IIS 中使其運作的步驟。這只是對指示的補充。
0
Protik Mukherjee
19 年前
Fedora mysql 問題!!
在 Fedora 3 中,php mysql 模組沒有隨預設安裝一起提供。若要安裝它,請使用 $>yum install php_mysql
如果您不這樣做,您將會收到 mysql 函數(如 mysql_connect())的錯誤

希望這對您有所幫助!
0
nleippe at integr8ted dot com
20 年前
trace_mode 會破壞 SQL_CALC_FOUND_ROWS。
這是因為它會在單獨發送 <query> 之前發出 EXPLAIN <query>,因此後續的 SELECT FOUND_ROWS() 不再是下一個連續查詢,結果為零。
這對我來說至少適用於 MySQL 4.0.21 和 4.1.5gamma。
(PHP 4.3.9)
0
aidan at php dot net
20 年前
如果您想複製 `mysql --html` 的輸出,以 HTML 表格形式列印您的結果,請參閱此函數

http://aidanlister.com/repos/v/function.mysql_draw_table.php
0
irn-bru at gmx dot de
20 年前
請注意,sql.safe_mode 設定會影響所有 mysql_* 函數。這與 php 安全模式無關,請檢查 php.ini 中的 [SQL] 區段。

我發現,如果您設定 sql.safe_mode = On,mysql_connect 將會忽略提供的使用者名稱和密碼,而改為使用腳本擁有者(在 debian 上檢查過)。

Brian
0
mijnpc at xs4all dot nl
22 年前
如果您的 Windows 機器執行具有 PHP 的網頁伺服器,如果您被允許建立與遠端網頁伺服器的安全 Telnet 連線(連接埠 22),則您不需要安裝 MySQL 伺服器來在本機測試腳本。

為此,您需要一個支援連接埠轉發的安全 Telnet 用戶端。
在您建立連線之前,請定義連接埠轉發。
將本機連接埠 3306 轉發到 [遠端伺服器的名稱或 IP]:3306
請確保本機連接埠接受來自其他主機的連線
儲存此連線階段

使用使用者名稱和密碼連線到遠端伺服器
最小化 Shell,這樣就完成了...

您可以使用與在遠端伺服器上工作時相同的使用者名稱(和密碼)!
例如:$link = mysql_connect("localhost", "root", "") or die("no way jose");

您可能會在 xx 分鐘後收到 Shell 超時,具體取決於您的遠端伺服器,只需重新連線或不時在 Shell 中按下 Enter 鍵即可...

一個極佳的免費安全 Telnet 用戶端範例是 Putty:Putty:http://www.chiark.greenend.org.uk/~sgtatham/putty/

這個「發現」真的為我節省了很多時間,因為我不用一次又一次地將腳本上傳到遠端伺服器,只需按下 [儲存] 就夠了,呵呵 (-
-1
Vladimir Kosmala
14 年前
這是一個包含 mysql 擴充功能主要函數的 mysql 輔助程式。對於初學者來說很容易理解,而且由於查詢是安全的,因此非常有用。它了解您的需求,只需編寫您的 SQL 查詢即可。我稱它為 mysql_magic。

<?php
// 範例
$nb_affected = mysql_magic('delete from users');
$nb = mysql_magic('select count(*) from users');
$one_row = mysql_magic('select * from users limit 1');
$all_rows = mysql_magic('select * from users where name = ?', 'John');
$id = mysql_magic('insert into users(name,rank) values(?,?)', 'Vincent', 3);
?>

<?php
// 用法: mysql_magic($query [, $arg...]);
function mysql_magic()
{
global
$dblink, $sqlhost, $sqluser, $sqlpass, $sqlbase;
$narg = func_num_args();
$args = func_get_args();

if (!
$dblink)
{
$dblink = mysql_connect( $sqlhost, $sqluser, $sqlpass );
mysql_select_db( $sqlbase, $dblink );
}

$req_sql = array_shift($args);
$req_args = $args;

$req_query = mysql_bind($req_sql, $req_args);
$req_result = mysql_query($req_query);

if (!
$req_result)
{
trigger_error(mysql_error());
return
false;
}

if (
startsWith($req_sql, 'delete') || startsWith($req_sql, 'update'))
{
return
mysql_affected_rows(); // -1 || N
}
else if (
startsWith($req_sql, 'insert'))
{
return
mysql_insert_id(); // ID || 0 || FALSE
}
else if (
endsWith($req_sql, 'limit 1'))
{
return
mysql_fetch_assoc($req_result); // [] || FALSE
}
else if (
startsWith($req_sql, 'select count(*)'))
{
$line = mysql_fetch_row($req_result);
return
$line[0]; // N
}
else
{
return
mysql_fetch_all($req_result); // [][]
}
}

function
mysql_bind($sql, $values=array())
{
foreach (
$values as &$value) $value = mysql_real_escape_string($value);
$sql = vsprintf( str_replace('?', "'%s'", $sql), $values);
return
$sql;
}

function
mysql_fetch_all($result)
{
$resultArray = array();
while((
$resultArray[] = mysql_fetch_assoc($result)) || array_pop($resultArray));
return
$resultArray;
}

function
startsWith($haystack,$needle,$case=false) {
if(
$case){return (strcmp(substr($haystack, 0, strlen($needle)),$needle)===0);}
return (
strcasecmp(substr($haystack, 0, strlen($needle)),$needle)===0);
}

function
endsWith($haystack,$needle,$case=false) {
if(
$case){return (strcmp(substr($haystack, strlen($haystack) - strlen($needle)),$needle)===0);}
return (
strcasecmp(substr($haystack, strlen($haystack) - strlen($needle)),$needle)===0);
}
?>

別忘了設定 $sqlhost、$sqluser、$sqlpass 和 $sqlbase。

參考了
mysql_bind:https://php.dev.org.tw/manual/en/function.mysql-real-escape-string.php#96391
mysql_fetch_all:https://php.dev.org.tw/manual/en/function.mysql-fetch-assoc.php#90030

trigger_error 可以用這個提示來加強:https://php.dev.org.tw/manual/en/function.trigger-error.php#98910
-1
SID TRIVEDI
17 年前
<?php
/*
在執行 Apache 的 32 位元 Windows XP 上安裝 MySQL (社群版) 伺服器

在 Windows 上,建議將 MySQL 安裝為 Windows 服務,這樣 MySQL 會在 Windows 啟動和停止時自動啟動和停止。安裝為服務的 MySQL 伺服器也可以從命令列指令控制,或使用圖形化「服務」公用程式(如 phpMyAdmin)。

PHP ---> MySQL 連接器(以擴充功能形式提供的 php_mysql.dll 和 php_mysqli.dll)
MySQL 在 https://mysqldev.dev.org.tw/downloads/connector/php/ 上為 Windows 作業系統提供 mysql 和 mysqli 擴充功能,適用於 MySQL 4.1.16 及更高版本、MySQL 5.0.18 和 MySQL 5.1。與在 php.ini 中啟用任何 PHP 擴充功能(例如 php_mysql.dll)一樣,PHP 指令 extension_dir 應該設定為 PHP 擴充功能所在的目錄。

MySQL 預設不再啟用,因此必須在 php.ini 內啟用 php_mysql.dll DLL。此外,PHP 需要存取 MySQL 用戶端程式庫。Windows PHP 發行版本中包含一個名為 libmysql.dll 的檔案,為了讓 PHP 與 MySQL 通訊,此檔案必須可在 Windows 系統的 PATH 中存取。

以下 PHP 腳本有助於測試 PHP 與 MySQL 的連線。
*/

//$connect = mysql_connect("您的主機名稱", "MySQL 根目錄", 'MySQL 密碼 (如果有)');
//$connect = mysql_connect("主機名稱或位址 - 127.0.0.1", "root", '密碼');
$connect = mysql_connect("localhost", "root", 'password');
if (
$connect){
echo
"恭喜您!\n<br>";
echo
"已成功連線至 MySQL 資料庫伺服器。\n<br>";
}else{
$error = mysql_error();
echo
"無法連線至資料庫。錯誤 = $error。\n<br>";
exit();
}

// 關閉連線
$close = mysql_close($connect);
if (
$close){
echo
"\n<br>";
echo
"正在關閉連線...\n<br>";
echo
"MySQL 連線也已成功關閉。\n<br>";
}else{
echo
"關閉 MySQL 連線時發生問題。\n<br>";
}
exit();
?>
-1
davesteinb at yahoo dot com
18 年前
我建立這個函式來減少資料庫呼叫次數。您可以將 Mysql 結果儲存在工作階段變數中,並依任何欄位排序結果。在 AJAX 應用程式中可能很好用。

<?

function mysql_sort($results, $sort_field, $dir="ASC") {
$temp_array = array();
$i=0;
foreach ($results as $res) {
$temp_array[$i] = $res[$sort_field];
$i++;
}
if ($dir=="ASC") {
asort($temp_array);
} else {
arsort($temp_array);
}

$new_results = array();
$i=0;
foreach($temp_array as $k => $v) {
$new_results[$i] = $results[$k];
$i++;
}
ksort($new_results);
return $new_results;

}

// 使用
if (count($_SESSION["res"])==0) {
$_SESSION["res"] = [取得資料庫結果的方式]
}

$_SESSION["res"] = mysql_sort($_SESSION["res"], $_REQUEST["sort"], $_REQUEST["dir"]);

?>
<table>
<tr>
<td><a href="page.php?sort=f_name&dir=<? echo ($_REQUEST["dir"]=="ASC") ? "DESC":"ASC"; ?>">名字</a></td>
<td><a href="page.php?sort=l_name&dir=<? echo ($_REQUEST["dir"]=="ASC") ? "DESC":"ASC"; ?>">姓氏</a></td>
</tr>

<? foreach ($_SESSION["res"] as $r) {?>
<tr>
<td><?=$r["f_name"]?></td>
<td><?=$r["l_name"]?></td>
</tr>
<? } ?>
</table>
-1
sb at stephenbrooks dot org
18 年前
我正在更換網站主機,而我之前的主機以一系列 SQL 要求的方式提供了資料庫「傾印」,我假設這些要求必須依序執行才能在另一個系統上重建資料庫。它使用「MySQL 傾印 9.11」產生。查詢以分號和換行符號結尾,而註解行則以雙連字號開頭。下列腳本會開啟與 SQL 伺服器的連線,並將此格式的傾印檔案 $file 載入資料庫 $dest_db。

function load_db_dump($file,$sqlserver,$user,$pass,$dest_db)
{
$sql=mysql_connect($sqlserver,$user,$pass);
mysql_select_db($dest_db);
$a=file($file);
foreach ($a as $n => $l) if (substr($l,0,2)=='--') unset($a[$n]);
$a=explode(";\n",implode("\n",$a));
unset($a[count($a)-1]);
foreach ($a as $q) if ($q)
if (!mysql_query($q)) {echo "Fail on '$q'"; mysql_close($sql); return 0;}
mysql_close($sql);
return 1;
}

如果「;\n」序列出現在查詢內,這可能不完全可靠,但我希望它能幫助擁有這類傾印的其他使用者。
-1
mw-php at ender dot com
23 年前
mysql_fetch_[row|object|array] 函式以字串類型傳回資料。由於 php 變數具有高度彈性,這通常無關緊要,但如果您剛好從資料庫擷取兩個整數,然後嘗試使用位元運算子進行比較,就會遇到麻煩,因為 (19 & 2) == 2,但 ("19" & "2") == 0。為了解決這個問題,如果您使用資料庫中的變數搭配位元運算子,請在使用 settype() 函式比較之前,將變數明確轉換為整數。
-1
Joe Greklek
18 年前
我看到許多新手對於最初未安裝擴充功能感到沮喪,所以這裡提供一個 Windows 的快速教學。

可以使用 php5 安裝程式。只要務必也取得 php5 的 .zip 或「手動」版本。

像其他應用程式一樣安裝它。它非常簡單。別忘了在安裝結束時,於最後一個訊息方塊中設定安全性。接下來,如果您將 php 安裝到 c:\php,則需要將它新增至 PATH 環境變數。這是非常重要的步驟。

現在開啟 php5 的 .zip 手動版本,並將 ext 資料夾和「libmysql.dll」解壓縮至「c:\php\」。

您*必須*將 libmysql.dll 和 ext 資料夾的安全性權限設定為 IUSR_"機器名稱" 的「讀取/讀取&執行」。例如我的機器名稱為 master<帳戶 = IUSR_MASTER>。如果您不這樣做,您會收到 ******.dll - 存取遭拒 的類型訊息。

接下來,編輯 php.ini 檔案,通常位於 c:\windows\。
找到 extension_dir 變數的行並使其顯示
extension_dir = "c:\php\ext\"

然後向下捲動一點,找到顯示下列內容的行
;extension=php_mbstring.dll
;extension=php_bz2.dll
;extension=php_curl.dll
;extension=php_dba.dll
;extension=php_dbase.dll
;extension=php_exif.dll
;extension=php_fdf.dll
;extension=php_filepro.dll
;extension=php_gd2.dll
;extension=php_gettext.dll
;extension=php_ifx.dll

只要針對您想要載入的每個擴充功能移除分號即可。例如
extention=php_mysql.dll
依此類推。

現在只要重新啟動,一切應該就會順利。盡情查詢。您基本上只需要重新啟動就能更新 PATH 環境變數。希望這至少能幫助一個人。:)
-1
mbabcock-php at fibrespeed dot net
23 年前
由於沒有開始和結束/回滾交易的函式,您必須使用 mysql_query("BEGIN")、mysql_query("COMMIT") 和 mysql_query("ROLLBACK")。這些只會在支援交易的資料表上正確運作。您可能也希望撰寫自己的 mysql_begin (等) 函式,以執行上述查詢。
-2
joachimb at gmail dot com
16 年前
懶人記錄

<?php
/// 如果不存在,則建立名為 $table 的資料表,格式為 (id, when, message),並在其中插入包含 $message 的列。
/// 如果未提供連線詳細資訊,則會使用目前的資料庫連線。$database 和 $when 也相同。
///
/// @returns 成功時傳回 TRUE,失敗時傳回 FALSE。
///
/// @example mysql_put_contents("orders", "我想要起司漢堡?", "mysite", NULL, "127.0.0.1:3306", "mysite_user", "密碼") 或 die(mysql_error());
/// @example mysql_put_contents("guestbook", "長貓說:我好~~~~~~~~~~長") 或 die("錯誤!");
function mysql_put_contents($table, $message, $database = NULL, $when = NULL, $host = NULL, $user = NULL, $pass = NULL) {
if(
$host)
mysql_connect($host, $user, $pass);
if(
$database)
mysql_select_db($database);

$qry = "CREATE TABLE IF NOT EXISTS `$table` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`when` TIMESTAMP DEFAULT NOW(),
`message` TEXT NOT NULL
);"
;
$result = mysql_query($qry);
if(
$result === FALSE)
return
FALSE;

$qry = "INSERT INTO `$table` VALUES(NULL, ".($when ? $when : 'NULL').", '".mysql_real_escape_string($message)."');";

$result = mysql_query($qry);
if(
$result === FALSE)
return
FALSE;

return
TRUE;
}

?>
-2
mega-squall at caramail dot com
17 年前
對於 Windows 使用者,請注意

如果 Apache 安裝為服務,且您變更 PATH 變數使其可以存取 libmysql.dll,您必須重新啟動機器才能套用變更。
-2
nick smith
19 年前
我對這方面相當陌生,但剛成功設定了 (在 Windows XP 上) Apache 2.0.54,搭配 PHP 5.0.4 和 mySQL 4.1.13,還有 phpMyAdmin 2.6.4,而且遇到了許多其他人回報的相同問題。我實際上並不知道 mySQL 未載入 PHP 中,直到我嘗試使用 phpMyAdmin,它告訴我檢查我的 PHP/MySQL 設定。

基本上我已經做了其他人提到的所有事情(將 extension_dir 設定為 c:\php\ext (不是 c:\php\ext\ ),取消 php.ini 中 extension=php_mysql.dll 的註解,並將 c:\php 加入我的 PATH 環境變數),但嘗試啟動 Apache 時,仍然會出現令人惱火的訊息,指出找不到 php_mysql.dll。

我重新啟動了電腦,結果它就正常運作了!似乎我編輯 PATH 之後必須重新啟動 Windows。我一直拖到最後才重新啟動,因為在 XP 上我從來不需要這樣做 - 對系統變數的變更總是會立即生效。在像是 Windows 98 這種需要將 PATH 加入到 autoexec.bat 的系統上我還能理解,但在 XP 上也需要這樣做真是個謎。

總之,試試看吧,這可能會讓你免於拔掉珍貴的頭髮!

N.
-2
david at kiwi dot com
17 年前
我想要遞增使用者名稱,這些使用者名稱必須是字母 A-Z 或 a-z,如果有人使用 "abc",系統會自動給他 "abc1",下一個申請相同使用者名稱的人將自動獲得 "abc2",下一個則是 "abc3",依此類推。如果我在 MySQL 中輸入以下內容:

SELECT username FROM users WHERE username REGEXP 'abc[0-9*]';

結果是

abc1
abc2
abc3

我從其他論壇獲得了以下腳本,但它無法運作:

<?php
$username
= 'abc';
$query = "SELECT username FROM users WHERE username LIKE '$username%'";
$res = mysql_query($query);
while(
$row = mysql_fetch_assoc($res)) {
$n = str_replace($username, '', $row['username']);
if (
$old_n+1!=$n) {
$new_user = $username . ($old_n+1);
break;
}
}
?>

除了腳本無法運作之外,"LIKE" 函式也不適用,因為如果使用者名稱為 "blue",它會選取使用者名稱 "blue1" 和 "bluebird1",因此 "REGEXP '$username[0-9*]'" 看起來是唯一或正確的選項。

我嘗試將 REGEXP 選項與其餘程式碼結合使用,但似乎 PHP 無法與以下內容中的 "[" 和 "]" 互動:

$query = "SELECT username FROM users WHERE username REGEXP '$username[0-9*]'";
-3
Nobody Special
17 年前
這個僅限 PHP5 的類別用於避免傳遞 $db。感謝 arjen at queek dot nl 的範例。

<?php
class SQL {
private
$db;
public function
__construct($host="localhost",$user="root",$pass="",$db="") {
$this->db = @mysql_connect($host, $user, $pass);
if(!
$this->db) die(@mysql_error());
if(
$db != "") $dbs = @mysql_select_db($db);
if(!
$dbs) die(@mysql_error());
}
public function
__destruct() {
@
mysql_close($db);
}
public function
__call($function, $arguments) {
array_push($arguments, $this->db);
$return = call_user_func_array("mysql_".$function, $arguments);
if(!
$return) die(@mysql_error());
}
}

$db = new SQL();
$query = $db->query("SELECT * FROM this_table WHERE my_variable='1'");
$fetch = $db->fetch_array($query);
print_r($fetch);
?>
-3
admin at mihalism dot com
17 年前
這是一個適用於任何網站的易於使用的 MySQL 類別。

<?php
class mysql_db{
//+======================================================+
function sql_connect($sqlserver, $sqluser, $sqlpassword, $database){
$this->connect_id = mysql_connect($sqlserver, $sqluser, $sqlpassword);
if(
$this->connect_id){
if (
mysql_select_db($database)){
return
$this->connect_id;
}else{
return
$this->error();
}
}else{
return
$this->error();
}
}
//+======================================================+
function error(){
if(
mysql_error() != ''){
echo
'<b>MySQL Error</b>: '.mysql_error().'<br/>';
}
}
//+======================================================+
function query($query){
if (
$query != NULL){
$this->query_result = mysql_query($query, $this->connect_id);
if(!
$this->query_result){
return
$this->error();
}else{
return
$this->query_result;
}
}else{
return
'<b>MySQL Error</b>: Empty Query!';
}
}
//+======================================================+
function get_num_rows($query_id = ""){
if(
$query_id == NULL){
$return = mysql_num_rows($this->query_result);
}else{
$return = mysql_num_rows($query_id);
}
if(!
$return){
$this->error();
}else{
return
$return;
}
}
//+======================================================+
function fetch_row($query_id = ""){
if(
$query_id == NULL){
$return = mysql_fetch_array($this->query_result);
}else{
$return = mysql_fetch_array($query_id);
}
if(!
$return){
$this->error();
}else{
return
$return;
}
}
//+======================================================+
function get_affected_rows($query_id = ""){
if(
$query_id == NULL){
$return = mysql_affected_rows($this->query_result);
}else{
$return = mysql_affected_rows($query_id);
}
if(!
$return){
$this->error();
}else{
return
$return;
}
}
//+======================================================+
function sql_close(){
if(
$this->connect_id){
return
mysql_close($this->connect_id);
}
}
//+======================================================+
}

/* Example */

$DB = new mysql_db();
$DB->sql_connect('sql_host', 'sql_user', 'sql_password', 'sql_database_name');
$DB->query("SELECT * FROM `members`");
$DB->sql_close();
?>
-3
allan666 at NOSPAM dot gmail dot com
19 年前
[編輯註記:在 MySQL v5.0+ 中,您可以使用 INFORMATION_SCHEMA 表格來檢索關於表格、視圖、資料庫等等的資訊。 --zak@php.net]

這是一個小的函式,用來解析 MySQL 建立表格的 DDL。這個函式接受一個包含建立表格的 SQL 程式碼的字串,並返回表格名稱、表格欄位、表格索引鍵欄位和欄位類型,所有這些都以陣列形式返回(顯然除了名稱之外)。這個函式要求主鍵被命名為 "id",而外鍵被命名為 "id..."。所有外鍵類型都被假設為 int(或其變體,如 bigint 等)。所有這些限制都可以很容易地修改以適應其他需求。

這是一個 DDL 程式碼的範例。

CREATE TABLE `telefones` (
`id` int(11) NOT NULL auto_increment,
`id_tipo_telefone` int(11) NOT NULL default '0',
`numero` varchar(15) NOT NULL default '',
`id_pessoa` int(11) NOT NULL default '0',
PRIMARY KEY (`id`),
KEY `id_tipo_telefone` (`id_tipo_telefone`),
KEY `id_pessoa` (`id_pessoa`),
CONSTRAINT `0_775` FOREIGN KEY (`id_tipo_telefone`) REFERENCES `tipos_telefone` (`id`),
CONSTRAINT `0_776` FOREIGN KEY (`id_pessoa`) REFERENCES `pessoas` (`id`)
) TYPE=InnoDB

這會返回

$tbname = "telefones"
$fields = array("numero");
$kfields = array("id_tipo_telefone","id_pessoa");
$tipos = array("varchar");

希望對您有所幫助...

<?php
function parseQuery($Q, &$tbname, &$fields, &$kfields, &$tipos) {

/** 剖析正確的規則:
*
* 1 - 主鍵必須命名為 "id"
* 2 - 外鍵必須命名為 "id...",例如:id_field
* 3 - 建議使用小寫
*/

$Q = str_replace(array(chr(10),chr(13))," ",$Q);
$Q = str_replace(array("'","`")," ",$Q);

preg_match("/([^(]*)\((.*)\)(.*)/",$Q,$A);

$part1 = $A[1];
$part2 = $A[2];
$part3 = $A[3];

preg_match("/(.*) ([a-zA-Z_]+)/",$part1,$A);

$tbname = strtolower($A[2]);

$temp = split(",",$part2);
foreach (
$temp as $t) {
preg_match("/ *([a-zA-Z_]+) +([a-zA-Z_]+)(.*)/",$t,$A);
$pcampo = strtolower($A[1]);
$ptipo = strtolower($A[2]);
if (!
preg_match("/$pcampo/","primary key constraint id unique foreign") ) {
if ( (
$pcampo[0] == "i") && ($pcampo[1] == "d") )
$kfields[] = $pcampo;
else {
$fields[] = $pcampo;
$tipos[] = $ptipo;
}
}
}
}
?>
-4
soren at byu dot edu
21 年前
假設您想要從純文字密碼產生 MySQL 密碼雜湊值。通常,您只需提交 MySQL 查詢「SELECT PASSWORD('password')」,但如果因為某些原因您無法直接存取 MySQL 資料庫,則可以使用以下函式(直接從 MySQL 原始碼翻譯而來)。

<?php
function mysql_password($passStr) {
$nr=0x50305735;
$nr2=0x12345671;
$add=7;
$charArr = preg_split("//", $passStr);

foreach (
$charArr as $char) {
if ((
$char == '') || ($char == ' ') || ($char == '\t')) continue;
$charVal = ord($char);
$nr ^= ((($nr & 63) + $add) * $charVal) + ($nr << 8);
$nr2 += ($nr2 << 8) ^ $nr;
$add += $charVal;
}

return
sprintf("%08x%08x", ($nr & 0x7fffffff), ($nr2 & 0x7fffffff));
}
?>

範例

<? print mysql_password("hello"); ?>

輸出

70de51425df9d787

這與您直接在 MySQL 中執行「SELECT PASSWORD('hello')」所得到的結果相同。 希望您永遠不會遇到必須使用此程式碼的情況,但如果您需要它(就像我一樣),它就在這裡。
To Top