2

私はこのようなphpでブロブデータを保存します

$this->_db->exec"CREATE TABLE media (url TEXT, content BLOB)");

$fp = fopen($encoded['path'], 'rb');
$sql = "INSERT INTO media (url, content) VALUES (?, ?)";
$stmt = $this->_db->prepare($sql);
$stmt->bindValue(1, $encoded['url'], PDO::PARAM_STR);
$stmt->bindValue(2, $fp, PDO::PARAM_LOB);
$stmt->execute();
fclose($fp);

そして、私のC ++プログラム(badaフレームワークを使用)で、blob列からデータを読み返しました。問題は、ローカルホスト (バージョン 5.3.2-1ubuntu4.2) で php を使用すると、C++ アプリが blob 列を blob タイプとして正しく認識できることです。しかし、リモート ホスト (php バージョン 5.2.12) を使用して sqlite ファイルを作成すると、C++ アプリが blob 列を TEXT TYPE として認識し、バイナリ データが破損します。

誰かが理由と回避策を知っていますか?

ありがとう

4

1 に答える 1

0

同じSQLiteバージョンを読み書きしていることを確認してください。サーバー=SQLite2<-> C ++=SQLite2またはサーバー=SQLite3<-> C ++=SQLite3失敗するため。

それが問題である場合(SQLite内の変更が原因である可能性が高く、2つのバージョンを読み取りと互換性がないようにします)、2つのオプションがあります。

  1. サーバーを更新する(プロバイダーに問い合わせる)か、
  2. 該当するC++ソースコードを使用して、サーバーが処理できるものをソフトウェアが読み取れるようにすることができます。この目的のために、sqlite.orgでSQLite2のソースコード(およびそこにアーカイブされている他のすべてのビルド)を入手できます。より正確には、最新バージョンのSQLite2ソースコードの最新ダウンロードをhttp://www.sqlite.org/cgi/src/info/47fee16ba9で見つけることができるので、サポートをc++プログラムにコンパイルできます。

それがあなたのボートを揺さぶることを願っています。;)

PS:それが問題ではなく、同じSQLiteバージョンに対して読み取り/書き込みを行っている場合は、保存しようとしているバイナリデータを16進エンコードして、BLOBではなくTEXTに保存してみてください。これは回避策ですが、機能します。

于 2011-12-16T06:09:13.493 に答える