私はPHPでPDOラッパーとSQLiteを混在させて使用しようとしています。私はデータベースから正常に読み取ることができますが、ブラウザでページを表示すると、データベースにコミットされている更新はありません。不思議なことに、シェルからスクリプトを実行すると、データベースが更新されます。私はファイルパーミッションを原因と考えていましたが、フルアクセス(chmod 777)を提供しているデータベースでも問題は解決しません。ファイルの所有者を変更する必要がありますか?もしそうなら、何に?SQLite/PHPは読み取り専用ですか?
ところで、私のマシンは、標準のMac OS X LeopardでPHPを有効にしてインストールします。
@トムマーティン
ありがとうございます。私はちょうどあなたのコードを実行し、PHPがユーザー_wwwとして実行されるように見えます。私はその後、_wwwによって所有されるデータベースをchowningしようとしましたが、それもうまくいきませんでした。
PDOのerrorInfo関数は、エラーが発生したことを示していないことにも注意してください。これは、PDOが読み取り専用のデータベースを開いているような設定ですか? SQLiteがファイル全体の書き込みロックを実行すると聞いたことがあります。書き込みを妨げる何かによってデータベースがロックされている可能性はありますか?
私は問題のコードを含めることに決めました。これは多かれ少なかれPHPのGrant's scriptのポートになるでしょう。これまでのところ、質問セクションです:
<?php
$db = new PDO('sqlite:test.db');
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://stackoverflow.com/users/658/kyle");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_COOKIE, "shhsecret=1293706652");
$page = curl_exec($ch);
preg_match('/summarycount">.*?([,\d]+)<\/div>.*?Reputation/s', $page, $rep);
$rep = preg_replace("/,/", "", $rep[1]);
preg_match('/iv class="summarycount".{10,60} (\d+)<\/d.{10,140}Badges/s', $page, $badge);
$badge = $badge[1];
$qreg = '/question-summary narrow.*?vote-count-post"><strong.*?>(-?\d*).*?\/questions\/(\d*).*?>(.*?)<\/a>/s';
preg_match_all($qreg, $page, $questions, PREG_SET_ORDER);
$areg = '/(answer-summary"><a href="\/questions\/(\d*).*?votes.*?>(-?\d+).*?href.*?>(.*?)<.a)/s';
preg_match_all($areg, $page, $answers, PREG_SET_ORDER);
echo "<h3>Questions:</h3>\n";
echo "<table cellpadding=\"3\">\n";
foreach ($questions as $q)
{
$query = 'SELECT count(id), votes FROM Questions WHERE id = '.$q[2].' AND type=0;';
$dbitem = $db->query($query)->fetch(PDO::FETCH_ASSOC);
if ($dbitem['count(id)'] > 0)
{
$lastQ = $q[1] - $dbitem['votes'];
if ($lastQ == 0)
{
$lastQ = "";
}
$query = "UPDATE Questions SET votes = '$q[1]' WHERE id = '$q[2]'";
$db->exec($query);
}
else
{
$query = "INSERT INTO Questions VALUES('$q[3]', '$q[1]', 0, '$q[2]')";
echo "$query\n";
$db->exec($query);
$lastQ = "(NEW)";
}
echo "<tr><td>$lastQ</td><td align=\"right\">$q[1]</td><td>$q[3]</td></tr>\n";
}
echo "</table>";
?>
申し訳ありませんが、もう助けません。あなたがシェルからそれを稼働させることができるなら、まだパーミッションの問題のように聞こえるかもしれません。とにかくありがとう。 –
私にはパーミッションのように思えますが、ここでどのようにそれが可能かはわかりません。 –
'$ db = new PDO( 'sqlite:test.db');'をフルパスに変更しようとしましたか? Like .. '$ db = new PDO( 'sqlite:/tmp/test.db');'? – dbr