Sous-sections

Php et odbc

Compiler php avec sapdb

A priori pas besoin de driver manager odbc pour se connecter à MaxDB avec php 4.3.2. On va donc juste recompiler php:
Les backslashes sont pour indiquer une ligne qui se continue.

[shell] LDFLAGS="-L/usr/lib -L/usr/local/sapdb/indep_prog/lib" \
CPPFLAGS="-I/usr/local/sapdb/indep_prog/incl" \
./configure --prefix=/usr/local/php-4.2 \
--with-apxs2=/usr/local/apache2/bin/apxs \
--with-sapdb=/usr/local/sapdb/indep_prog/lib \
...suite des options de compilation...
[shell] export LDFLAGS=-L/usr/local/sapdb/indep_prog/lib; make
[shell] make install

Si je n'indique pas tous ces flags j'ai des erreurs de compilation (gcc 2.95). Sinon c'est une compilation tranquille.

Configuration du odbc.ini

Ce n'est pas la doc qui manque. Voici une excellente page

Il va falloir mettre un odbc.ini, le fichier qui contient les DSN, Data Source Names, dans /etc

;
;  /etc/odbc.ini
;
[ODBC Data Sources]
NomDeSource=MAXDB 7.5

[NomDeSource]
Driver=/usr/local/sapdb/indep_prog/lib/libsqlod.so
Description=MAXDB 7.5 DATABASE
ServerDB=MAILS
ServerNode=localhost

Et ça devrait le faire, il n'y a plus qu'à écrire quelques lignes de code.

Remarque:Il ne doit pas y avoir d'espace entre la variable et la valeur de la variable !

Select

Je vous livre ces quelques lignes, la doc sur le net est assez pauvre.

Il y a là différentes requêtes, notez l'utilisation de odbc_result_all() avec son formatage, fonction intéressante pour des affichages de champs qui ne contiennent pas de balises html. Comme un Message-Id par exemple avec ses < et >. Je n'ai pas chiadé la présentation avec de la couleur mais on doit pouvoir.

Pour un insert, c'est du pareil au même.

Je n'ai pas encore testé la syntaxe utilisant le ? dans le odbc_prepare() (cf 8.6). Mais je suppose que ça doit se faire avec le tableau passé en argument à odbc_execute().

<?
$dsn="Courrieldb";

$conn_id = odbc_connect ($dsn, "jm", "jm_passwd") or die ("odbc_connect(): erreur\n");

$sql1 = "SELECT subject FROM courriel WHERE msgid LIKE '%murphy>'";
$prepare = odbc_prepare ($conn_id, $sql1);
odbc_execute ($prepare);
$item = odbc_result ($prepare, 1);
print ($item);
print ("<br><br><br>\n");

$sql2 = "SELECT msgid, mailfrom, subject ";
$sql2 .= "FROM courriel ";
$sql2 .= "WHERE subject  LIKE '%Masq%'";
$prepare = odbc_prepare ($conn_id, $sql2);
odbc_execute ($prepare);
$rowid = 1;
while ($row = odbc_fetch_row ($prepare, $rowid))
{
    $msgid = htmlspecialchars (odbc_result ($prepare, 1));
    $from = htmlspecialchars (odbc_result ($prepare, 2));
    $subject = odbc_result ($prepare, 3);
    print ($msgid . " ..... " . $from . " ...... " . $subject . "<br>\n");
    $rowid++;
}
print ("<br><br><br>\n");

odbc_autocommit ($conn_id, false);

$sql3 .= "SELECT maildate, subject ";
$sql3 .= "FROM courriel ";
$sql3 .= "WHERE subject  LIKE '%Masq%'";
$result_id = odbc_prepare ($conn_id, $sql3);
odbc_execute ($result_id);
odbc_commit ($conn_id);
odbc_result_all ($result_id, "border=2 cellpadding=3 cellspacing=4");
odbc_close ($conn_id);
?>

A la place du $dsn, on peut indiquer la chaine hôte:base (entre guillemets donc), ça va bien aussi et ça permet de s'affranchir de l'odbc.ini

Mise à jour avec curseur

Le curseur permet une mise à jour positionnée. On reprend le code précédent, avec une mise à jour assez farfelue:

$sql = "SELECT msgid, mailfrom, subject ";
$sql .= "FROM courriel ";
$sql .= "WHERE subject  LIKE '%Masq%'";
$sql .= "FOR UPDATE OF subject";
$result = odbc_prepare ($conn_id, $sql);
odbc_execute ($result);
$cursor = odbc_cursor ($result);
$sql2 = "UPDATE courriel SET subject = 'Casque' ";
$sql2 .= "WHERE CURRENT OF $cursor";
$rowid = 1;
while ($row = odbc_fetch_row ($result, $rowid))
{
	odbc_exec ($conn_id, $sql2);
    $rowid++;
}

La syntaxe du select indique qu'on veut générer un résultat pour une mise à jour du champ "subject". On récupère le nom du curseur de résultat avec odbc_cursor() et on utilise la syntaxe du WHERE CURRENT OF nom_curseur dans l'instruction UPDATE pour mettre à jour au niveau de la position du curseur. Évidemment dans cet exemple on bouge le curseur donc il y a mise à jour sur tous les enregistrements du résultat. On peut procéder à l'identique avec une instruction DELETE.

jean-michel OLTRA 2004-07-06