PHP: MySQL関数 - Manual
PHP  
downloads | documentation | faq | getting help | mailing lists | | php.net sites | links | my php.net 
search for in the  
<msqlmysql_affected_rows>
view the version of this page
Last updated: Tue, 21 Dec 2004

LXX. MySQL関数

導入

以下の関数は、MySQLデータベースサーバーへのアクセスを可能にします。 MySQLに関するより詳細な情報は、 にあります。

MySQL のドキュメントは、にあります。

要件

以下の関数を利用可能とするには、MySQLサポートを指定してPHPをコン パイルする必要があります。

インストール手順

configureオプション--with-mysql[=DIR]を 使用することにより、PHPからMySQLデータベースへのアクセス が可能となります。

PHP 4では、オプション --with-mysqlはデフォルトで有効と なっています。この動作を無効にするには、configureオプション --without-mysqlを使用する必要が あるでしょう。また、PHP 4でMySQLインストールDIRへのパスを指定しなかった 場合、PHPはバンドルされたMySQLクライアントライブラリを 使用します。 Windowsでは、DLLは附属せず、PHP 4に組込まれています。 (auth-mysqlのような)MySQLを使用する他のアプリケーショを実行するユーザは、 バンドルされたライブラリを使うべきではなく、むしろ、 --with-mysql=/path/to/mysql のようにMySQLのインストールディレクトリを指定するべきです。 これにより、PHPがMySQLによりインストールされた クライアントライブラリを使用するようになり、衝突が回避されます。

PHP 5では、MySQLはもはやデフォルトでは有効とならず、PHPにMySQLライブラリも 付属しません。 この理由の詳細については、 FAQ を参照して下さい。

このMySQL拡張モジュールは、4.1.0以降のMySQLのバージョンでは動作しません。 これ以降については、MySQLiを使用して 下さい。

警告

この拡張モジュールとrecode拡張モジュールを同時にロードした場合、 PHPのクラッシュと起動に関する問題が発生する可能性があります。 より詳細な情報については、 recode拡張モジュールを参照して下さい。

注意: latin (デフォルト)以外の文字セットを必要とする場合、 使用する文字セットのサポートを有効にしてコンパイルした(バンドル版でない) libmysqlをインストールする必要があります。

実行用の設定

これらの関数の動作は、php.iniの設定により変化します。

表 1. MySQL設定オプション

名前デフォルト変更の可否
mysql.allow_persistent"On"PHP_INI_SYSTEM
mysql.max_persistent"-1"PHP_INI_SYSTEM
mysql.max_links"-1"PHP_INI_SYSTEM
mysql.default_portNULLPHP_INI_ALL
mysql.default_socketNULLPHP_INI_ALL
mysql.default_hostNULLPHP_INI_ALL
mysql.default_userNULLPHP_INI_ALL
mysql.default_passwordNULLPHP_INI_ALL
mysql.connect_timeout"0"PHP_INI_SYSTEM
PHP_INI_* 定数の詳細と定義については、 ini_set()を参照して下さい。

以下に設定ディレクティブの簡単な説明を示します。

mysql.allow_persistent boolean

MySQLへの 持続的接続 を可能にするかどうか。

mysql.max_persistent integer

プロセス毎の持続的MySQL接続の最大数。

mysql.max_links integer

持続的接続を含むプロセス毎のMySQL接続の最大数。

mysql.default_port string

他のポートが指定されない場合、データベースサーバ接続時に使用され るデフォルトのTCPポート番号。デフォルトが指定されない場合、ポー トは、環境変数MYSQL_TCP_PORT/etc/servicesmysql-tcpエントリ、コンパイル時の MYSQL_PORT定数の順番で取得されます。 Win32では、MYSQL_PORT定数のみが使用されます。

mysql.default_socket string

他にソケット名が指定されない場合、ローカルなデータベースサーバに 接続する時のデフォルトのソケット名。

mysql.default_host string

他のサーバ名が指定されない場合に、データベースサーバへの接続時 に使用されるデフォルトのサーバ名。 safe modeでは適用されません。

mysql.default_user string

他のユーザ名が指定されない場合に、データベースサーバへの接続時 に使用されるデフォルトのユーザ名。 safe modeでは適用されません。

mysql.default_password string

他のパスワードが指定されない場合に、データベースサーバへの接続時 に使用されるデフォルトのパスワード。 safe modeでは適用されません。

mysql.connect_timeout integer

接続の有効時間(単位:秒)。Linuxでは、この有効時間はサーバからの最 初の応答の待ち時間としても使用されます。

リソース型

MySQLモジュールでは、2種類のリソース型が使用されています。 最初のリソースはデータベース接続のリンクIDで、2番目のリソースは、 クエリ結果を保持するリソースです。

定義済みの定数

これらの定数は、この拡張モジュールで定義されており、 この拡張モジュールがPHP内部にコンパイルされているか実行時に動的にロー ドされるかのどちらかの場合のみ使用可能です。

Since PHP 4.3.0 it is possible to specify additional client flags for the mysql_connect() and mysql_pconnect() functions. The following constants are defined:

表 2. MySQL client constants

ConstantDescription
MYSQL_CLIENT_COMPRESSUse compression protocol
MYSQL_CLIENT_IGNORE_SPACEAllow space after function names
MYSQL_CLIENT_INTERACTIVEAllow interactive_timeout seconds (instead of wait_timeout) of inactivity before closing the connection.
MYSQL_CLIENT_SSLUse SSL encryption. This flag is only available with version 4.x of the MySQL client library or newer. Version 3.23.x is bundled both with PHP 4 and Windows binaries of PHP 5.

The function mysql_fetch_array() uses a constant for the different types of result arrays. The following constants are defined:

表 3. MySQL fetch constants

ConstantDescription
MYSQL_ASSOC Columns are returned into the array having the fieldname as the array index.
MYSQL_BOTH Columns are returned into the array having both a numerical index and the fieldname as the array index.
MYSQL_NUM Columns are returned into the array having a numerical index to the fields. This index starts with 0, the first field in the result.

以下は、MySQLデータベースに接続し、クエリを実行し、結果レコードを 出力、接続を断する例です。

例 1. MySQL拡張モジュールに関する例

<?php
// データベースに接続し、選択する
$link = mysql_connect("mysql_host", "mysql_login", "mysql_password")
   or die(
"Could not connect");
print
"Connected successfully";
mysql_select_db("my_database")
   or die(
"Could not select database");

// SQLクエリを実行する
$query = "SELECT * FROM my_table";
$result = mysql_query($query)
   or die(
"Query failed");

// HTMLに結果を出力する
print "<table>\n";
while (
$line = mysql_fetch_array($result, MYSQL_ASSOC)) {
   print
"\t<tr>\n";
   foreach (
$line as $col_value) {
       print
"\t\t<td>$col_value</td>\n";
   }
   print
"\t</tr>\n";
}
print
"</table>\n";

// 接続を閉じる
mysql_close($link);
?>

目次
mysql_affected_rows -- 一番最近のクエリーで変更された行の数を得る
mysql_change_user --  アクティブな接続でログイン中のユーザーを変更する
mysql_client_encoding -- Returns the name of the character set
mysql_close -- MySQL接続を閉じる
mysql_connect -- MySQLサーバーへの接続をオープンする
mysql_create_db -- MySQLデータベースを作成する
mysql_data_seek -- 内部的な結果ポインタを移動する
mysql_db_name -- データベース名を得る
mysql_db_query -- MySQLクエリーを送信する
mysql_drop_db -- MySQLデータベースを破棄(削除)する
mysql_errno --  直近のMySQL処理からエラーメッセージのエラー番号を返す
mysql_error --  直近に実行されたMySQLコールのエラーメッセージを返す
mysql_escape_string --  mysql_queryで使用するために文字列をエスケープする
mysql_fetch_array --  連想配列、添字配列、またはその両方として結果の行を取得する
mysql_fetch_assoc --  連想配列として結果の行を取得する
mysql_fetch_field --  結果からカラム情報を取得し、オブジェクトとして返す
mysql_fetch_lengths --  結果における各出力の長さを得る
mysql_fetch_object -- 結果の行をオブジェクトとして取得する
mysql_fetch_row -- 結果を添字配列として取得する
mysql_field_flags --  結果において指定したフィールドのフラグを得る
mysql_field_len --  指定したフィールドの長さを得る
mysql_field_name -- 結果において指定したフィールド名を得る
mysql_field_seek --  結果ポインタを指定したフィールドオフセットにセットする
mysql_field_table --  指定したフィールドが含まれるテーブルの名前を得る
mysql_field_type --  結果において指定したフィールドの型を得る
mysql_free_result -- 結果保持用メモリを開放する
mysql_get_client_info -- MySQLクライアント情報を得る
mysql_get_host_info -- MySQLホスト情報を得る
mysql_get_proto_info -- MySQLプロトコル情報を得る
mysql_get_server_info -- MySQLサーバ情報を得る
mysql_info --  Get information about the most recent query
mysql_insert_id -- 直近のINSERTで生成されたIDを得る
mysql_list_dbs --  MySQLサーバー上で利用可能なデータベースのリストを得る
mysql_list_fields -- MySQL結果フィールドのリストを得る
mysql_list_processes -- List MySQL processes
mysql_list_tables -- MySQL データベース上のテーブルのリストを得る
mysql_num_fields -- 結果におけるフィールドの数を得る
mysql_num_rows -- 結果における行の数を得る
mysql_pconnect --  MySQLサーバーへの持続的な接続をオープンする
mysql_ping -- Ping a server connection or reconnect if there is no connection
mysql_query -- SQLクエリーをMySQLに送信する
mysql_real_escape_string --  Escapes special characters in a string for use in a SQL statement
mysql_result -- 結果データを得る
mysql_select_db -- MySQL データベースを選択する
mysql_stat -- Get current system status
mysql_tablename -- フィールドのテーブル名を得る
mysql_thread_id -- Return the current thread ID
mysql_unbuffered_query --  Send an SQL query to MySQL, without fetching and buffering the result rows


add a note add a note User Contributed Notes
MySQL関数
06-Mar-2005 07:01
If you are installing PHP5 on Windows 2003 server (AKA Win 2k3) and need MySQL to work using the either the php_mysql.dll or php_mysqli.dll or both of them at the same time, and MySQl isn't showing up in phpinfo, then your php.ini is probably not loading.  In the direction in the PHP 5 zip file, they will tell you to add your PHP install directory to your windows path.  This should tell php where to load its php.ini from but it doesn't.  If you want to get this to work, you don't have to copy any DLL's anywhere like everyone suggests.  All you have to do is add the folling regsitry key to windows:

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

simply copy the above 2 lines of code into a text file and save the file as php_ini_path.reg

After you save the file it will look like a registry file.  Simply double click on it.

It will make it so PHP will look for your php.ini in C:\PHP.  I would assume you can edit this if you install php into a different location, but I haven't tried that.

After running the reg file, make sure your php.ini is in your PHP dir and make sure all the appropriate things are set.  This should get you up and running.  Make sure you also follow all the steps on how to make it work in IIS.  This is just an addition to the direction.
Protik Mukherjee
03-Mar-2005 05:34
Fedora mysql problems!!
In Fedora 3 the php mysql module does not come with the default installation. To install it use $>yum install php_mysql
If u dont do this you will get errors with mysql functions like mysql_connect()

Hope this helps!
j at jonathany.com
01-Feb-2005 08:09
Users attempting to install MySQL under PHP5 on Windows may have trouble if they use the MSI installer of PHP, which does not include the DLL php_mysql.dll .

In order to succesfully install MySQL on PHP5, download the ZIP version of PHP, which includes the php_mysql.dll.
tumaine no at spam verizon net
23-Dec-2004 04:21
I had a hard time with upgrading to php version 5.2.0 in Windows XP Pro since mySQL queries all of a sudden stopped working and led to blank pages on my site.  I spent a good half day searching google trying to figure out this problem, and didn't quite know how compiling PHP would help me.  It is not necessary.  Set up PHP manually with the ZIP folder download. 

This is a good link to read and wish I found it earlier:



If you are getting an error popup about not being able to load some mysql.dll when starting apache, you need to change this in your php.ini file:

extension_dir = "./" to something like "c:\php\ext"
 
Also what I was doing wrong was that I forgot to uncomment the following line in my php.ini file:

extension=php_mysql.dll

Restart apache, and everything should work.

Thought that I could save someone time and frustration when upgrading, since versions 5+ do not include mySQL support by default as earlier versions apparently do.
jon at mysql dot com
11-Dec-2004 10:32
Re Pat's note: You can add the --old-passwords option in the [mysqld] section of your MySQL my.cnf or my.ini configuration file. This option will force the MySQL server  to use the old-style password hashing for all connections. This is not really recommended, as it's less secure, but will allow you to use existing accounts without resetting the passwords.

Of course, as already mentioned, you can use the MySQL OLD_PASSWORD() function instead to handle this issue on an account-by-account basis.

The optimal solution when migrating to MySQL 4.1+ from a previous version is to upgrade to PHP 5 (if you're not using it already) and rewrite any code accessing MySQL using the mysqli extension, which is more secure and provides a much better API.

For more information, see the MySQL Manual:
lkujala at uniserve dot com
18-Nov-2004 09:43
PROBLEM:
Error Message: the specified module could not be found.
When trying to load a php_mysql.dll / php_mysqli.dll / php_mssql.dll extension on a Windows platform.

CAUSE:
The standard windows installer package is rather incomplete; it does not include any of the DLL's needed for the optional extensions. In order to use any extension you need to install the FULL zip distribution (unless you like fooling around with dll hell), not just the php_*.dll extensions. You might as well include ALL of the DLL's since the dependencies as documented are wrong (i.e. you need more than libmysql.dll for the php_mysql.dll to load).

I did find the standard windows installer useful for the inital setup though.
22-Oct-2004 02:04
Having trouble loading extensions under windows? Seems as though php.ini is not being read at all?

Maybe the php5 installer has written a PHPIniDir directive in your httpd.conf telling php to look for php.ini in c:\php\
nleippe at integr8ted dot com
12-Oct-2004 10:22
trace_mode breaks SQL_CALC_FOUND_ROWS.
This is because it emits an EXPLAIN <query> before sending the <query> by itself, thus the subsequent SELECT FOUND_ROWS() is no longer the next consecutive query, and the result is zero.
This was true for me for at least MySQL 4.0.21 and 4.1.5gamma.
(PHP 4.3.9)
Melvin Nava: e-4(at)venezolano.web.ve
13-Sep-2004 07:02
To count page hits, just put next code in a text file and include it in every one of your pages. It will log even different querystrings as different pages. (a MySQL database and table is needed first)

This can be a pretty good example of what you can do with PHP and MySQL. I made this script to log and show all hits in:

<?php
/************************
This needs a MySQL table you can create with this:

CREATE TABLE `stats_pagecounter` (
  `id` int(25) NOT NULL auto_increment,
  `page_name` varchar(255) NOT NULL default '',
  `page_hits` int(25) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) TYPE=MyISAM;

**************************
COUNTING STARTS
*************************/
function page_count($page) {
  
$c_link        = mysql_connect('localhost', 'username', 'password')
       or die(
'counter CONNECT error: '.mysql_errno().', '.mysql_error());
  
mysql_select_db('database_name');
  
$c_query    = "SELECT * FROM stats_pagecounter
       WHERE (page_name = '$page')"
;
  
$c_result    = mysql_query($c_query, $c_link)
       or die(
'counter SELECT error: '.mysql_errno().', '.mysql_error());
   if (
mysql_num_rows($c_result)) {
      
$row=mysql_fetch_array($c_result,MYSQL_ASSOC);
      
$pcounter = $row['page_hits']+1;
      
$c_update = "UPDATE stats_pagecounter
           SET page_hits = '$pcounter' WHERE page_name = '$page'"
;
      
$c_hit = mysql_query($c_update, $c_link)
           or die(
'counter UPDATE error: '.mysql_errno().', '.mysql_error());
   } else {
      
$c_insert = "INSERT INTO stats_pagecounter
           VALUES ( '0', '$page', '1')"
;
      
$c_page = mysql_query($c_insert, $c_link)
           or die(
'counter INSERT error: '.mysql_errno().', '.mysql_error());
      
$pcounter = 1;
   }
  
mysql_free_result($c_result);
  
mysql_close($c_link);
   return
$pcounter;
}
$phpself_url = $_SERVER['SERVER_NAME'].
  
$_SERVER['PHP_SELF'].'?'.
  
$_SERVER['QUERY_STRING'];
$page_hits = page_count($phpself_url);
/************************
COUNTING ENDS
*************************/

/************************
Put next line in a page to show his page hits
(If you want to)
************************/
echo $page_hits;
?>
aidan at php dot net
15-Aug-2004 12:59
If you want to replicate the output of `mysql --html`, printing your results in a HTML table, see this function:

irn-bru at gmx dot de
27-May-2004 12:27
Note, that the sql.safe_mode configuration setting does effect all mysql_* functions. This has nothing to to with the php safe mode, check the [SQL] section in php.ini.

I found out, that if you set sql.safe_mode = On, mysql_connect will ignore provided username and passwort and makes use of the script owner instead (checked on debian).

Brian
Pat
22-Jan-2004 11:02
[Editor Note:
The password hashing was updated in MySQL 4.1, you must use the MySQLi extension with MySQL 4.1+ (or use the following method to allow
pre 4.1 clients to connect).]

MySQL 5.0 has a new password system, and PHP cannot connect to it because it cannot send a correct password.  You must use the MySQL command OLD_PASSWORD() when adding a user to the database, or PHP cannot connect as of the library that comes with PHP 5.0Beta3
gyohng at netscape dot net
20-Jun-2003 05:16
The following page contains a complete easy to read tutorial of MySQL programming with PHP.

soren at byu dot edu
14-Mar-2003 09:23
Let's say that you want to generate a MySQL password hash from a plain text password.  Normally, you would just submit the MySQL query "SELECT PASSWORD('password')", but if for some reason you can't access to MySQL database directly, then you can use the following function (translated right out of the MySQL source code):

<?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));
}
?>

example:

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

outputs:

70de51425df9d787

Which is the same result you get if you do "SELECT PASSWORD('hello')" directly in MySQL.  Hopefully you'll never be in a situation where you have to use this, but if you need it (like I did), it's here.
past at sbox dot tugraz dot at
21-Feb-2003 10:17
As MySQL docs say, RAND() is not very usefull for generation of randomized result orders.

But this worked for me on Linux, however:
Somewhere before:
mt_srand((double)microtime()*1000000);
 
"SELECT *, " RAND(".mt_rand(0,86622340).")*10000%100 AS randomvalue ORDER BY randomvalue"

The upper value for mt_rand() has to be Quite Big to see any effect on MySQL's RAND(). The exact number shouldn't be significant. Note the multiplication and modulo; MySQL seems to count steadily upwards when generating random numbers, so we take some numbers from between.
mijnpc at xs4all dot nl
20-Nov-2002 10:33
If you have a Windows machine running a webserver with PHP you don't need to install MySQL server to locally test scripts, if you are granted to establish a Secure Telnet connection (port 22) to the remote webserver.

To do this you need a Secure Telnet client, which supports port-forwarding.
Before you establish a connection, define the port-forward.
Forward local port 3306 to [name or ip of remote server]:3306
Make sure that local ports accept connections from other hosts
Save this session

Connect to remote server with username and password
Minimize the shell and that's it...

You can use the same username (and password) as if you were working on the remote server !
E.g. : $link = mysql_connect("localhost", "root", "") or die("no way jose");

You may get a shell-timeout after xx minutes depending on your remote server, just reconnect or press enter in the shell once in a while...

An example of a superb freeware Secure Telnet client is Putty : Putty :

This 'discovery' really has saved me a lot of time because I don't have to upload the scripts to the remote server time and time again, pressing [save] is enough, heh (-:
16-Jun-2002 07:38
Regarding transactions, you must use a recent MySQL version which supports InnoDB tables. you should read the mysql manual (the part about Innodb tables, section 7.5) and configure your server to use them.
Some reading about how it works:

(Click where it says Part2, I can't put the direct URL here because it is too long)

Then in PHP you use commands like:

mysql_query("BEGIN");
mysql_query("COMMIT");
mysql_query("ROLLBACK");

You must make sure that you convert your existing tables to innodb or create new ones: CREATE TABLE (...) type=innodb;
jeyoung at priscimon dot com
25-Apr-2002 04:23
[Ed. Note:
This may be due to the fact that subsequent calls to mysql_connect with the same parameters return the same resource id for the connection, so in reality it is using the same connection.  In order to force a new link, you must specify the new_link parameter in mysql_connect.]

MySQL transactions

MySQL supports transactions on tables that are of type InnoDB. I have noticed a behaviour which is puzzling me when using transactions.

If I establish two connections within the same PHP page, start a transaction in the first connection and execute an INSERT query in the second one, and rollback the transaction in the first connection, the INSERT query in the second connection is also rolled-back.

I am assuming that a MySQL transaction is not bound by the connection within which it is set up, but rather by the PHP process that sets it up.

This is a very useful "mis-feature" (bug?) because it allows you to create something like this:

class Transaction {
  var $dbh;

  function Transaction($host, $username, $password) {
   $this->dbh = mysql_connect($host, $username, $password);
  }

  function _Transaction() {
     mysql_disconnect($this->dbh);
  }

  function begin() {
   mysql_query("BEGIN", $this->dbh);
  }

  function rollback() {
     mysql_query("ROLLBACK", $this->dbh);
  }

  function commit() {
   mysql_query("COMMIT", $this->dbh);
  }
}

which you could use to wrap around transactional statements like this:

$tx =& new Transaction("localhost", "username", "password");
$tx->begin();
$dbh = mysql_connect("localhost", "username", "password");
$result = mysql_query("INSERT ...");
if (!$result) {
  $tx->rollback();
} else {
  $tx->commit();
}
mysql_disconnect($dbh);
unset($tx);

The benefit of such a Transaction class is that it is generic and can wrap around any of your MySQL statements.
nospam at nospam dot nos
19-Nov-2001 05:17
ever wanted to know the date a table was last updated? use this:

$info = mysql_fetch_array(mysql_query("show table status from databasename like 'tablename'"));
echo $info["Update_time"];
skelley at diff dot nl
25-Sep-2001 09:11
Hi, here's a nice little trick to select records in random order from a table in a MySQL database prior to version 3.23

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

[Editors note: And just "SELECT * FROM foo ORDER BY RAND()" after 3.23]
mbabcock-php at fibrespeed dot net
29-Jul-2001 02:41
Since there aren't functions to start and end/rollback transactions, you'll have to use mysql_query("BEGIN"), mysql_query("COMMIT") and mysql_query("ROLLBACK").  These will only work properly on tables that support transactions.  You may also wish to roll your own mysql_begin (etc) functions that run the above queries for you.
philip at cornado dot com
23-Jul-2001 07:24
If you're new to this, you really should learn basic SQL before moving on.  PHP != SQL. Here's are a few good basic SQL tutorials:

  *
  *
  *
mw-php at ender dot com
22-Jun-2001 04:11
The mysql_fetch_[row|object|array] functions return data as type string. Owing to the very flexible nature of php variables, this is normally not relevent, but if you happen to retrieve two integers from a database, then try to compare with bitwise operators, you'll run into trouble, because (19 & 2) == 2, but ("19" & "2") == 0. To remedy this, if you use variables from a database with bitwise operators, use the settype() function to explicitly cast your variables as integers before comparing.

<msqlmysql_affected_rows>
 Last updated: Tue, 21 Dec 2004
show source | credits | sitemap | contact | advertising | mirror sites 
Copyright © 2001-2005 The PHP Group
All rights reserved.
This unofficial mirror is operated at: /
Last updated: Mon Mar 14 08:13:06 2005 Local time zone must be set--see zic manual page