Próbowałem użyć SQLite z otoką PDO w PHP z mieszanym sukcesem. Mogę odczytać z bazy danych dobrze, ale żadna z moich aktualizacji nie jest zatwierdzana do bazy danych, gdy przeglądam stronę w przeglądarce. Co ciekawe, uruchomienie skryptu z mojej powłoki powoduje aktualizację bazy danych. Podejrzewałem, że uprawnienie do pliku jest sprawcą, ale nawet z bazą zapewniającą pełny dostęp (chmod 777) problem nadal występuje. Czy powinienem spróbować zmienić właściciela pliku? Jeśli tak, to co?SQLite/PHP tylko do odczytu?
Przy okazji, mój komputer to standardowa instalacja Mac OS X Leopard z aktywowanym PHP.
@Tom Martin
Dziękuję za odpowiedź. Po prostu uruchomiłem twój kod i wygląda na to, że PHP uruchamia się jako użytkownik _www. Następnie próbowałem pomalować bazę danych na własność _www, ale to też nie działało.
Należy również zauważyć, że funkcja errorInfo PDO nie wskazuje na błąd. Czy to może być ustawienie z PDO w jakiś sposób otwierające bazę danych tylko do odczytu? Słyszałem, że SQLite wykonuje blokady zapisu w całym pliku. Czy jest możliwe, że baza danych jest zablokowana przez coś innego, co uniemożliwia zapis?
Postanowiłem uwzględnić dany kod. To będzie mniej więcej port Grant's script do PHP. Do tej pory jest to tylko sekcja Pytania:
<?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>";
?>
Przykro mi, człowieku, nie mogę ci więcej pomóc. Wciąż brzmi to jak problem uprawnień, jeśli możesz go uruchomić z powłoki. –
Dzięki i tak. Wydaje mi się, że to też jest kwestia uprawnień, ale nie rozumiem, jak to jest możliwe. –
Próbowano zmienić '$ db = new PDO ('sqlite: test.db'); 'na pełną ścieżkę? Podobnie jak .. '$ db = new PDO ('sqlite: /tmp/test.db');'? – dbr