J'ai déjà fait ça en ASP avec Oracle, en PHP avec MySQL.
Avec Access, ça coince.
Le code suivant est plus simple qu'il n'y paraît mais il s'est allongé du fait des multiples affichages et précautions de débogage.
La variable $realData à false permet de travailler avec la petite chaîne "ABCD" plutôt que le contenu du fichier BMP.
Les écritures dans les fichier logo2 et logo3 permettent de vérifier ce qui est inséré ou lu dans la base de données avec l'éditeur de texte.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<?
ob_start();
### GLOBAL ####################################################################
function OuiNon ( $condition ) {
  # Retourne OUI, NON, NULL ou $condition
	if      ($condition===true)  return 'OUI';
	else if ($condition===false) return 'NON';
	else if ($condition===null)  return 'NULL';
	else                         return $condition;
}
function hex2bin ( $data ) {
	$len = strlen( $data );
	return pack( 'H'.$len, $data );
}
$DSNless = 'Driver={Microsoft Access Driver (*.mdb)};Dbq=';
define( '¶', "\n" );
ini_set('error_prepend_string','');
ini_set('error_append_string','');
ini_set('html_errors','Off');
$realData = true; // For debug, I don't use real data from the file
ob_end_clean();
###############################################################################
### PAGE Début ################################################################
###############################################################################
 
header('Content-Type: text/plain; charset=ASCII');
$cnx = odbc_connect( $DSNless.'test.mdb', '','' ); // , SQL_CUR_USE_IF_NEEDED
 
### INSERT ####################################################################
	if ( $realData ) {
		$data = file_get_contents( 'logo.bmp' );
		$data = addslashes( $data ); // to avoid a ' to accidentally close a string
	} else {
		$data = chr(65).chr(66).chr(67).chr(68); // = "ABCD" sure ! Even from UTF-8 PHP file.
	}
	echo "file_put_contents: ".OuiNon( file_put_contents( 'logo2.bmp', $data )).¶;
	echo "data: ".$data.¶;
	$SQL = "INSERT INTO `img` ( bin_data ) VALUES ('$data');"; // LONGBINARY côté PHP et Objet OLE côté Access
	odbc_exec( $cnx, $SQL );
 
### SELECT ####################################################################
	$qry = odbc_exec($cnx, "SELECT * FROM `img` ORDER BY id DESC");// To get the just last inserted, or WHERE id=".$id);
	if ( odbc_fetch_row( $qry ) ) {
		//header('Content-type: image/bmp');
		// ODBC_BINMODE_PASSTHRU ODBC_BINMODE_RETURN ODBC_BINMODE_CONVERT
		echo "odbc_binmode: ".OuiNon(  odbc_binmode( $qry, ODBC_BINMODE_RETURN )).¶;
		$id   = odbc_result( $qry, 'id' );
		$data = odbc_result( $qry, 'bin_data' );
		echo ¶;
		echo "id: ".$id.¶;
		echo "file_put_contents: ".OuiNon(  file_put_contents( 'logo3.bmp', $data )).¶;
		echo "mb_detect_encoding: ".OuiNon(  mb_detect_encoding ( $data, 'ASCII', true )).¶;
		echo "mb_check_encoding ASCII: ".OuiNon(  mb_check_encoding( $data, 'ASCII' )).¶;
		echo "data: ".$data.¶;
		//mb_convert_encoding( $data, '8bit', 'ASCII' );
		//$out = hex2bin($data);
		//echo "out: ".$out.¶;
	}
	else {
		header('Content-Type: text/plain; charset=ascii');
		return 'error';
	}
 
odbc_close($cnx);
###############################################################################
### PAGE Fin ##################################################################
###############################################################################
?>
Quand je veux stocker "ABCD", je récupère toujours "A�B�C�D�".
Et les solutions que j'ai pu trouver dans les forums ne résolvent pas le problème, même quand elles indiquent que celui-ci est résolu.
Quelqu'un aurait-il une solution ? une piste ?
Merci pour votre aide.