Pregunta

He estado tratando de usar SQLite con el PDO contenedor en PHP con éxito desigual.Puedo leer de la base de datos bien, pero ninguno de mis actualizaciones se están comprometidos con la base de datos cuando veo la página en el navegador.Curiosamente, la ejecución del script de mi concha no actualización de la base de datos.Yo sospechaba permisos de archivo como el culpable, pero incluso con la base de datos de acceso total (chmod 777) el problema persiste.Debo tratar de cambiar el propietario del archivo?Si es así, ¿qué?

Por cierto, mi equipo es el estándar de Mac OS X Leopard instalar con PHP activado.

@Tom Martin

Gracias por su respuesta.Me acaba de ejecutar su código, y parece que en PHP se ejecuta como usuario _www.Luego traté de chowning la base de datos de propiedad de _www, pero que no funciona tampoco.

También debo señalar que PDO errorInfo función no indica un error.Este podría ser un ajuste con PDO de alguna manera la apertura de la base de datos de sólo lectura?He oído que SQLite realiza bloqueos de escritura sobre el archivo completo.Es posible que la base de datos está bloqueado por algo más la prevención de la escritura?

He decidido incluir el código en cuestión.Esto va a ser más o menos un puerto de La subvención del script para PHP.Hasta ahora es sólo la sección de Preguntas:

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

?>
¿Fue útil?

Solución

Kyle, con el fin de DOP/Sqlite para el trabajo que usted necesita permiso de escritura para el directorio donde se encuentra la base de datos.

También, veo que realizar varias selecciones en el bucle.Esto puede estar bien si usted está construyendo algo pequeño y no muy cargado.De lo contrario, me gustaría sugerir la construcción de una sola consulta que devuelve varias filas y proceso en separar bucle.

Otros consejos

He encontrado la respuesta en el El manual de PHP "La carpeta que alberga el archivo de base de datos debe tener permisos de escritura."

Creo que PHP comúnmente se ejecuta como el usuario "nodody".No estoy seguro acerca en Mac, aunque.Si Mac tiene whoami usted podría tratar de echo exec('whoami'); para averiguar.

Para aquellos que se han encontrado sólo lectura problemas con SQLite en OS X:

1) Determinar el Apache httpd usuario y grupo al que pertenece el usuario:

grep "^de Usuario" /private/etc/apache2/httpd.conf
grupos _www

2) Crear un subdirectorio en /Library/WebServer/Documents para la base de datos(s) y cambiar el grupo de la httpd del grupo:

sudo chgrp _www /Library/WebServer/Documents/db

Una opción menos segura es abrir los permisos en /Library/WebServer/Documents:

sudo chmod a+w /Library/WebServer/Documents

@Tom Depende de cómo el hosting es la instalación, Si el servidor se ejecuta PHP como Módulo de Apache, a continuación, su más probable es que es 'nadie' (generalmente de cualquier usuario de apache está configurado como).Pero si PHP está configurado como cgi (tales como fast-cgi) y el servidor se ejecuta SuExec, a continuación, php se ejecuta como el mismo usuario que es propietario de los archivos.

Eitherway la carpeta que contendrá la base de datos debe ser escribible por el script, ya sea por ser el mismo usuario, o por tener permiso de escritura para el usuario de php.

@Michal Aparte de eso, uno podría usar beginTransaction();realizar todas las acciones necesarias, a continuación, comit();realmente comit de ellos.

Bueno, yo tenía el mismo problema ahora y pensé que por un error:acaba de poner cada inserción de la pieza de SQL instrucciones en el interior de un try...catch bloque que se va.Te hace hacer lo correcto camino, de lo contrario no funciona.Bueno, ahora ya funciona.Buena suerte para alguien más con este problema(como he usado este hilo a mí mismo para tratar de resolver mi problema).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top