Firebird/InterBase 函数
在线手册:中文 英文
PHP手册

ibase_query

(PHP 4, PHP 5)

ibase_queryExecute a query on an InterBase database

说明

resource ibase_query ([ resource $link_identifier ], string $query [, int $bind_args ] )

Performs a query on an InterBase database.

参数

link_identifier

An InterBase link identifier. If omitted, the last opened link is assumed.

query

An InterBase query.

bind_args

返回值

If the query raises an error, returns FALSE. If it is successful and there is a (possibly empty) result set (such as with a SELECT query), returns a result identifier. If the query was successful and there were no results, returns TRUE.

Note:

In PHP 5.0.0 and up, this function will return the number of rows affected by the query for INSERT, UPDATE and DELETE statements. In order to retain backward compatibility, it will return TRUE for these statements if the query succeeded without affecting any rows.

错误/异常

If you get some error like "arithmetic exception, numeric overflow, or string truncation. Cannot transliterate character between character sets" (this occurs when you try use some character with accents) when using this and after ibase_query() you must set the character set (i.e. ISO8859_1 or your current character set).

更新日志

版本 说明
5.3.1 On success the function now returns TRUE if there were no affected rows, where it previously returned 0 (a zero followed by an empty space).

范例

Example #1 ibase_query() example

<?php

$host 
'localhost:/path/to/your.gdb';

$dbh ibase_connect($host$username$password);
$stmt 'SELECT * FROM tblname';

$sth ibase_query($dbh$stmt) or die(ibase_errmsg());

?>

参见


Firebird/InterBase 函数
在线手册:中文 英文
PHP手册
PHP手册 - N: Execute a query on an InterBase database

用户评论:

apolenary at mail dot ru (31-May-2006 02:20)

In woking time ibase_qury() and ibase_fetch_row() with many time call thei arise the ERROR -> Fatal error: Maximum execution time of 30 seconds exceeded

ERROR arise in that script:
foreach ($vidtr_list as $vidtr)
{
   foreach ($branches_train as $from)
   {
     foreach ($branches_train as $to)
     {
       if (isset($pricelst_train[$vidtr][$from][$to]['ID']))
       {
    for ($i = 1; $i < 7; $i++)
    {
      $id = $pricelst_train[$vidtr][$from][$to]['ID'];
               $sql_v = "SELECT * FROM P_GET_PRICE_C_VES('$id','$std_train1_ves[$i]')";
      $query_rez = ibase_query($db,$sql_v) or die(ibase_errmsg());
      $prc_v =  ibase_fetch_row($query_rez);
      $sql_o = "SELECT * FROM P_GET_PRICE_C_OBYOM('$id', '$std_train1_obyom[$i]')";
       $query_rez = ibase_query($db,$sql_o) or die(ibase_errmsg());
      $prc_o =  ibase_fetch_row($query_rez);
                   
    if (isset($prc_o[0]))
    {
    $c_obyom = $prc_o[0];
    $c_ves = $prc_v[0];
    $prices_train[$id][$i] = array( 'OBYOM' => $c_obyom,'VES'    => $c_ves );
    $mysql_jde_price[$cnt_price] = "INSERT INTO jde_price VALUES (default, '$id', '$std_train1_ves[$i]', '$c_ves', '$std_train1_obyom[$i]', '$c_obyom');";
    $cnt_price++;
    }
    }
   }
  }
 }
}

How I can decide that Error?

akach [at] exat (dot) ru (28-Jul-2005 12:18)

If you use ibase_query() for SELECT without fetching result then you must know that SELECT isn't actually executed.
E.g. you perform "SELECT MY_UDF(param) from RDB$DATABASE" - MY_UDF isn't actually called until you fetch result.

This is a feature(or bug) of php interbase drivers, not interbase/firebird itself.

Test conditions: firebird 1.5.2, php 4.

escoric at latinmail dot com (17-Aug-2004 06:43)

/* If your work environment is windows */

$link=ibase_connect ($path, $usuario, $password, 'WIN1251');

chrisg at cordell dot com dot au (04-Jun-2004 07:57)

Simple function to retrieve the results of an SQL statement into an array, will also cater for BLOB fields:

<?php
function interbase_sql_exec ($sql) {
   
$dataArr = array();
   
$host = "svrname:path\filename.GDB";
   
$username = "whatever";
   
$password = "******";
   
$connection = ibase_connect ($host, $username, $password,'ISO8859_1', '100', '1');
   
$rid = @ibase_query ($connection, $sql);
    if (
$rid===false) errorHandle(ibase_errmsg(),$sql);
   
$coln = ibase_num_fields($rid);
   
$blobFields = array();
    for (
$i=0; $i < $coln; $i++) {
       
$col_info = ibase_field_info($rid, $i);
        if (
$col_info["type"]=="BLOB") $blobFields[$i] = $col_info["name"];
    }
    while (
$row = ibase_fetch_row ($rid)) {
        foreach (
$blobFields as $field_num=>$field_name) {
           
$blobid = ibase_blob_open($row[$field_num]);
           
$row[$field_num] = ibase_blob_get($blobid,102400);
           
ibase_blob_close($blobid);
        }
       
$dataArr[] = $row;
    }
   
ibase_close ($connection);
    return
$dataArr;
}
?>

SenorTZ senortz at nospam dot yahoo dot com (24-Jul-2003 12:18)

Two comments on interogating system tables in Interbase or Firebird; I hope it helps.

1. if you try to build a query string to extract data from a system table (that has the form "rdb$some_name"), you should divide the "rdb$some_name" table name in your query string using the string merge operator ".".
$query = "select rdb"."$"."relation_name as TABLE_NAME from rdb"."$"."relations where rdb"."$"."system_flag=0";

2. The second thing is related to the fact that you can later use (after the call to ibase_fetch_object) as field identifier the ALIAS used in the query for the "rdb$some_name" table.

Example:
$get_table_names_query = "select rdb"."$"."relation_name as TABLE_NAME from rdb"."$"."relations where rdb"."$"."system_flag=0";
//
$res_table_names_query = ibase_query($dbconnection, $get_table_names_query);
//
while ($row_table_names = ibase_fetch_object($res_table_names_query))
{
    print($row_table_names->TABLE_NAME);//alias used
}

Editor's note:
it is easier to use a backslash to protect the $-sign.
eg. "select rdb\$relation_name as TABLE_NAME from ..."

elf at royal dot net (28-Mar-2002 08:18)

A BLOB can be fetched easily adding IBASE_TEXT parameter to the ibase_fetch_object() function:

$r=ibase_query("select BLOB from BLOBS where BLOB_ID=1");
$d=ibase_fetch_object($r,IBASE_TEXT);

and it will fetch the BLOB as a text. Thus it referres to it like this:
$d->BLOB

*** ELF ***

eric_cavalcanti at hotmail dot com (19-Jan-2002 08:11)

Using BLOB

Insert BLOB:

 /* create blob */
$blob_id = ibase_blob_create();

 /* fill blob */
ibase_blob_add($blob_id, $var_datablob);

/* close new blob */
$blob_id_str = ibase_blob_close($blob_id);

/* insert into table  */
ibase_query("INSERT INTO BLOB_TABLE (ID, BLOB) VALUES (1, ?)",$blob_id_str);

Open BLOB:

/* query */
$set = ibase_query("SELECT BLOB FROM BLOB_TABLE WHERE ID = 1");

/* fetche a row */
$row = ibase_fetch_object($set);

/* open BLOB for read */
$blob_id = ibase_blob_open($row->BLOB);

/* get BLOB data */
$stringBLOB = ibase_blob_get($blob_id);

/* print BLOB */
echo $stringBLOB;

/* close new blob */
ibase_blob_close($blob_id);

/* free result */
ibase_free_result($set);