クエリ

クエリ – クエリの実行

Description

PEAR MDB2 では、データベースに対するクエリを実行するために いくつかのメソッドを用意しています。いちばん直接的なメソッドは query() です。これは、SQL クエリ文字列を引数として受け取ります。返り値には二通りの可能性があります。 結果を返すクエリ (SELECT など) が成功した場合には新しい MDB2_Result オブジェクト、失敗した場合には MDB2_Error オブジェクトを返します。 このメソッドは、データを操作するような文 (INSERT など) に対して使用してはいけません。

クエリの実行

<?php
// まずプログラムの最初に、$mdb2 という名前の
// MDB2 オブジェクトを作成します
require_once 'MDB2.php';

$mdb2 =& MDB2::connect('pgsql://usr:pw@localhost/dbnam');
if (
PEAR::isError($mdb2)) {
    die(
$mdb2->getMessage());
}

// クエリを実行します
$res =& $mdb2->query('SELECT * FROM clients');

// 結果がエラーでないかどうかを常にチェックします
if (PEAR::isError($res)) {
    die(
$res->getMessage());
}

// 切断します
$mdb2->disconnect();
?>

exec() は、 データを操作するクエリに対して使用します。 返り値には二通りの可能性があります。 データを操作する文 (INSERT など) によって変更された行数を表す整数値か、失敗した際には MDB2_Error オブジェクトを返します。 このメソッドは、結果を返すような文 (SELECT など) に対して使用してはいけません。

exec を使用してデータを操作する

<?php
// すでに $mdb2 という名前の MDB2 オブジェクトが存在するものとします
$sql  "INSERT INTO clients (name, address) VALUES ($name$address)";

$affected =& $mdb2->exec($sql);

// 結果がエラーでないかどうかを常にチェックします
if (PEAR::isError($affected)) {
    die(
$affected->getMessage());
}
?>

データ型

MDB2 は、すべてのドライバにまたがる多くのデータ型をサポートしています。 これらは、それぞれ適切なメソッドを使用して結果セットに設定されます。 サポートされるデータ型とその書式についての概要は こちら を参照ください。

結果の行数の制限および途中の行からの読み込み

結果セットの限定された行数のみを読み書きしたい場合、あるいは 結果セットの途中の行から読み込みを開始したい場合などは setLimit() をコールしてからクエリを発行します。 limit および offset は、その次に実行するクエリ発行メソッド あるいはプリペアドステートメントメソッドに対してのみ有効となり、 その後は設定がリセットされます。 これは、MDB2 が内部的に発行するクエリに対しても適用されます。 limit 機能をエミュレートで実現している RDBMS については、 DML 文では limit が動作しないことに注意しましょう。また、 この場合に何のエラーも発生しないことにも注意が必要です。

setLimit を使用した query および exec

<?php
// すでに $mdb2 という名前の MDB2 オブジェクトが存在するものとします

$sql "SELECT * FROM clients";
// 10 行目から始め、20 行読み込みます
$mdb2->setLimit(2010);
$affected =& $mdb2->exec($sql);

$sql "DELETE FROM clients";
if (
$mdb2->supports('limit_queries') === 'emulated') {
    echo 
'offset の設定は無視されました'
}
// 10 行だけを削除します
$mdb2->setLimit(10);
$affected =& $mdb2->exec($sql);

?>
データベースへの接続および接続の解除 (Previous) 値を適切にクォートしてクエリを作成する (Next)
Last updated: Sat, 25 Oct 2014 — Download Documentation
Do you think that something on this page is wrong? Please file a bug report or add a note.
View this page in:

User Notes:

Note by: Babbomaria
Is there a way to implement a timeout with in sql query execution?
Note by: petr.match@gmail.com
Solution (workaround) to security risk with stored plaintext password, mentioned in posts below:

<?php

// put this code just after initializing db connection (i.e. after MDB2::connect)
for ($__i 0$__i count($GLOBALS['_MDB2_databases']); $__i++) {
    
$GLOBALS['_MDB2_databases'][$__i]->dsn['password'] = '* hidden *';
    
$GLOBALS['_MDB2_databases'][$__i]->connected_dsn['password'] = '* hidden *';
}


?>


Enjoy!
Petr
Note by: till
I agree that a password in plaintext can lead to an issue - then again, you should not put that object on to your website. Log it, email it, whatever - straight output is a bad idea.

Therefor, this is more of a non-issue.
Note by: ropox.net
i think that ericfraz at gmail.com has a point, BUT this is done so we can develop the application and debug it without having to go through changing settings in other areas just to see an error. it is up to the developer how he will handle all errors and particularly with the Error object. for e.g. on a production environment you never print the message from an error in your database, but you either simply email the administrator and then kill your page..
Note by: isaac
Anyone tried to use MDB2's locking features? I can't seem to find any documentation.
Note by: cweiske
setLimit() is needed to make your code portable between database servers. Some use LIMIT X,Y while others support LIMIT X OFFSET Y only.
Note by: ericfraz@gmail.com
I don't know who came up with this idea of the setLimit function but it is a VERY bad idea. Why add a function that could cause so much potential trouble with performance and compatibly vs just limiting the query itself?

The mdb2_result_mysql Object CONTAINS THE DB PASSWORD!!!
This is a horrible thing for me to see in my print_r output and has to lead to a security risk.

mdb2_result_mysql Object
(
[db] => mdb2_driver_mysql Object
(
[db_index] => 1
[dsn] => Array
(
[phptype] => mysql
[dbsyntax] => mysql
[username] => dbuser
[password] => myrealpassword!
[protocol] => tcp
[hostspec] => localhost
[port] =>
[socket] =>
[database] =>
[mode] =>
)



BTW this is information, it needs to be said and said over and over util these things are changed.