Frage

Ich habe versucht, mit gemischtem Erfolg SQLite mit dem PDO-Wrapper in PHP zu verwenden. Ich kann aus der Datenbank in Ordnung lesen, aber keiner meiner Updates wird in die Datenbank übernommen, wenn ich die Seite im Browser anzuzeigen. Merkwürdigerweise hat das Skript von meiner Shell läuft die Datenbank aktualisieren. Ich vermuten Dateiberechtigungen als die Schuldigen, sondern auch mit der Datenbank bleibt vollen Zugang (chmod 777) das Problem bereitstellt. Soll ich versuchen, die Datei Besitzer zu ändern? Wenn ja, was?

übrigens, meine Maschine ist der Standard-Mac OS X Leopard mit PHP aktiviert installieren.

@ Tom Martin

Vielen Dank für Ihre Antwort. Ich lief den Code und es sieht aus wie PHP als Benutzer _www läuft. Ich habe dann versucht, die Datenbank Chownings von _www besessen werden, aber das hat nicht funktioniert entweder.

Ich sollte auch beachten, dass PDO die Funktion errorinfo fand keinen Fehler anzeigt. Könnte dies eine Einstellung sein mit PDO irgendwie die Datenbank für schreibgeschützt öffnen? Ich habe gehört, dass SQLite führt Sperren für die gesamte Datei schreiben. Ist es möglich, dass die Datenbank von etwas gesperrt ist sonst die Schreib verhindern?

Ich habe beschlossen, den Code in Frage aufzunehmen. Das wird mehr oder weniger eine Portierung von Grants Skript PHP. Bisher ist es nur die Fragen Abschnitt:

<?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>";

?>
War es hilfreich?

Lösung

Kyle, um für gU / SQLite Sie Erlaubnis Verzeichnis schreiben müssen, arbeiten, wo Ihre Datenbank befindet.

Auch ich sehe Sie mehrere wählt in Schleife auszuführen. Dies kann in Ordnung sein, wenn Sie etwas klein und nicht zu schwer beladen Bau sind. Sonst würde ich einzelne Abfrage vorschlagen bauen, die mehrere Zeilen zurückgibt und sie in separaten Schleife verarbeiten.

Andere Tipps

fand ich die Antwort auf dem PHP-Handbuch „Der Ordner, der die Datenbankdatei beherbergt muss beschreibbar sein.“

ich denke, PHP häufig läuft als Benutzer „nodody“. Nicht sicher, wenn etwa auf dem Mac. Wenn Mac hat whoami Sie könnten echo exec('whoami'); ausprobieren finden.

Für diejenigen, die Nur-Lese-Probleme mit SQLite auf OS X gestoßen sind:

1) Bestimmen Sie die Apache httpd Benutzer- und Gruppen der Benutzer gehört zu:

  

grep "^ User" /private/etc/apache2/httpd.conf
   Gruppen _www

Erstellen

2) ein Unterverzeichnis in / Library / WebServer / Documents für Ihre Datenbank (en) und ändern Sie die Gruppe zu der Gruppe httpd:

  

sudo chgrp _www / Library / WebServer / Documents / db

Eine weniger sichere Option ist Berechtigungen zum Öffnen auf / Library / WebServer / Documents :

  

sudo chmod a + w / Library / WebServer / Documents

@ Tom Hängt davon ab, wie das Hosting ist Setup Wenn der Server PHP als Apache-Modul läuft dann seine wahrscheinlich, dass es ‚niemand‘ (in der Regel unabhängig von Benutzer Apache Setup ist wie). Aber wenn PHP-Konfiguration als cgi (wie schnell-cgi) ist und der Server läuft SuExec dann läuft PHP als der Benutzer, der die Dateien besitzt.

Eitherway den Ordner, der die Datenbank enthält durch das Skript beschreibbar sein müssen, entweder durch den gleichen Benutzer zu sein, oder durch die Schreibberechtigung für den PHP-Benutzer festgelegt hat.

@Michal Davon abgesehen, könnte man verwenden begintransaction (); führen Sie alle erforderlichen Maßnahmen dann comit (); tatsächlich sie COMIT.

Nun, ich hatte das gleiche Problem jetzt und dachte, es durch einen Fehler aus: nur in einem try...catch Block jedes Einfügen Stück SQL-Befehls setzen, die es geht. Es macht man es richtig macht Weg sonst funktioniert es nicht. Nun, es funktioniert jetzt. Viel Glück für alle anderen mit diesem Problem (wie ich diesen Thread selbst verwendet, um zu versuchen, mein Problem zu lösen).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top