0

SQLite の壮大な主張にも惹かれます。しかし、他の多くのソフトウェアと同様に、親切な開発者による古いドキュメントやブログをフォローするのは簡単ではありません。これ以上の不満はありませんが、環境に関する質問と詳細は次のとおりです。

SQLite バージョン 2.8.17 がインストールされた PHP 5.2.17 を実行する Web ホスト プロバイダーがあります。phpinfo() の出力は、(pdo_sqlite セクションの下で) SQLite のバージョンが 3.3.7 であることを示しています。自宅では、PHP 5.4.10 を実行する Apache サーバーを使用しています。phpinfo() は両方のサイトで正常に動作します。ホーム ラップトップでは、(sqlite3 の下で) バージョンは 3.7.7.1 です。

問題については、いくつかのテーブルを含むデータベースを作成し、それ (データ ファイル) をホーム コンピューターとリモート ホストの間で ftp でやり取りしたいと考えています。PHPスクリプトを作成しようとしています

  1. 脚が存在しない場合はテーブルを作成...
  2. 既存の行を削除
  3. いくつかの新しい行を挿入します
  4. テーブルを読み取り、Html テーブルとして出力します

どういうわけか、リモートサーバーで正常に動作するこのファイル dbc1.php を作成しました。同様のファイル dbc2.php は、「存在しない場合」句で失敗し、次に他のステートメントで失敗し、dbc1.php によって作成されたデータベース ファイルを読み取ることさえできません。エラーメッセージは次のとおりです。

file is encrypted or is not a database

ファイルを移動すると、dbc2.php はファイルを作成しますが、挿入された行を取得できません。ローカルホストのバージョンはそれを訴えます

「C:\Web\php\dbcheck.php の 14 行目の未定義関数 sqlite_libversion() の呼び出し」

私のphp.iniファイルでは、「php_pdo_sqlite.dll」と「php_sqlite3.dll」の両方の拡張子をコメント解除し、両方のdllファイルが「ext」フォルダーに存在することを確認しました。他に何をする必要がありますか? 質問:

  1. dbc2.php よりも dbc1.php のスタイルが優先されますか? なぜですか、そうでないのですか?
  2. 主張されているように、SQLite データベース ファイルは本当に移植可能ですか?
  3. PHP5-SQLite3 チュートリアルへのポインターを教えてください。
  4. phpinfo() と sqlite_libversion() から異なるバージョン番号を取得するのはなぜですか?

返信ありがとうございます。以下に 3 つの PHP ファイルを示しますが、1 つのファイルを使用して操作を実行したいと考えています。

<html>

PHP で SQLite をテストする

'; echo "SQLite バージョン: " . sqlite_libversion() . '

';

    $db = new PDO('sqlite:dbname.db');      echo "[SQLite] DB opened<br/>";
    $db -> exec ($qc0);                     echo "[SQLite] table created<br/>";
    $db -> exec ($qr1);                     echo "[SQLite] Rows deleted<br/>";
    $db -> exec ($qi1); $db -> exec ($qi2);
    $db -> exec ($qi3); $db -> exec ($qi4); echo "[SQLite] Rows inserted<br/>";

    try {
            $rowsOfTable = $db -> query ($qr5);
            print "\t<table border='0' cellspacing='4' cellpadding='4'\n" .
                            "\t\t\tstyle='padding-top:20px;'>\n";
            print "\t\t<tr><td>Creation</td><td>Legs</td></tr>\n";
            foreach ($rowsOfTable as $row) {
                    echo "\t\t<tr>\n" .
                            "\t\t\t<td>" . $row['name'] . "</td>\n" .
                            "\t\t\t<td align='right'>" . $row['count'] . "</td>\n" .
                            "\t\t</tr>\n";
            }
            print "\t</table>\n";
    } catch (PDOException $ex) {
            die ($ex->getMessage());
    }

?>

これは、動作しない同じ Unix サーバー上のファイルです。

<html>

PHP で SQLite をテスト中 \n"; echo "SQLite バージョン: " . sqlite_libversion() . "
\n";

    try {
            $db = new SQLiteDatabase('./dbname.db', 0644, $error);
            echo "SQLite DB opened<br/>\n";

            $db -> queryExec ($qc0, $error);        echo "[SQLite] table created<br/>\n";
            $db -> queryExec ($qr1, $error);        echo "[SQLite] Rows deleted<br/>";
            $db -> queryExec ($qi1, $error);
            $db -> queryExec ($qi2, $error);
            $db -> queryExec ($qi3, $error);
            $db -> queryExec ($qi4, $error);        echo "[SQLite] Rows inserted<br/><br/>";
            if ($tableFromDB = sqlite_query ($db, $qr5, SQLITE_BOTH, $error)) {
                    print "\t<table border='2' cellpadding='4'>\n";
                    while ($row = $tableFromDB -> fetch()) {
                            print "\t\t<tr>\n" .
                                    "\t\t\t<td>" . $row['name'] .
                                    "</td><td>" . $row['count'] . "</td>\n\t</tr>\n";
                    }
                    print "\t</table>\n";
            } else {
                    echo "Cannot query DB table: $error\n";
    }} catch (Exception $ex) {
            die ($error);
    }

?>

最後に、ラップトップで実行しようとしているコード:

<html>

PHP で SQLite をテストする

phpinfo(); echo "PHP バージョン: " . phpversion() . '
'; echo "SQLite バージョン: " . sqlite_libversion() . '

';

    $db = new PDO('sqlite:dbname.db');      echo "[SQLite] DB opened<br/>";
    $db -> exec ($qc0);                     echo "[SQLite] table created<br/>";
    $db -> exec ($qr1);                     echo "[SQLite] Rows deleted<br/>";
    $db -> exec ($qi1); $db -> exec ($qi2);
    $db -> exec ($qi3); $db -> exec ($qi4); echo "[SQLite] Rows inserted<br/>";

    try {
            $rowsOfTable = $db -> query ($qr5);
            print "\t<table align='center' border='0' cellspacing='4' cellpadding='4'\n" .
                            "\t\t\tstyle='padding-top:20px;'>\n";
            print "\t\t<tr><td>Creation</td><td>Legs</td></tr>\n";
            foreach ($rowsOfTable as $row) {
                    echo "\t\t<tr>\n" .
                            "\t\t\t<td>" . $row['name'] . "</td>\n" .
                            "\t\t\t<td align='right'>" . $row['count'] . "</td>\n" .
                            "\t\t</tr>\n";
            }
            print "\t</table>\n";
    } catch (PDOException $ex) {
            die ($ex->getMessage());

} ?>

皆さん、明けましておめでとうございます:)

4

1 に答える 1

0

dbc2.php よりも dbc1.php のスタイルが優先されますか? なぜですか、そうでないのですか?

2 番目のサンプル (「dbc2」) で使用されているクラスと関数は、古い SQLite 2関数のものです。SQLite2 は古く、拡張機能は実際には PECL にプッシュされています。SQLite2 データベースを読み取る必要がない限り、最新のコードでは使用しないでください。

最初のサンプル (「dbc1」) で示されているように、 SQLite3 クラスまたは PDOのいずれかを使用する必要があります。

主張されているように、SQLite データベース ファイルは本当に移植可能ですか?

はい。ただし、メジャー バージョン間ではありません。任意のマシンとプラットフォーム間で SQLite3 データベース ファイルを移植し、正しく動作させることができます。

PHP5-SQLite3 チュートリアルへのポインターを教えてください。

最善の策は PDO を使用することなので、実際には PDO チュートリアルが必要です。そこにある唯一のものはMySQL用です。関数から来たユーザーにはこのチュートリアルmysql_をよくお勧めしますが、他の PDO チュートリアルもお勧めする人もいます。両方を読んで、MySQL 風味の SQL の代わりに SQLite 互換の SQL を使用してください。

SQLite サイトには、理解できることと理解できないことを詳しく説明する包括的な構文セクションがあります。ほとんどの場合、バッククォートを捨てるだけで、適切に動作させることができます。SQLite はインデックスの作成とテーブルの作成をバンドルすることも好みませんが、他の多くのデータベースもそうではありません。

phpinfo() と sqlite_libversion() から異なるバージョン番号を取得するのはなぜですか?

これは、古い SQLite 2 拡張機能がインストールされている一方で、SQLite 3 PDO 拡張機能もインストールされていることによる成果物です。

于 2013-01-01T03:28:00.160 に答える