He estado tratando de usar SQLite con el contenedor PDO en PHP con éxito mixto. Puedo leer bien de la base de datos, pero ninguna de mis actualizaciones se envía a la base de datos cuando veo la página en el navegador. Curiosamente, ejecutar el script desde mi shell actualiza la base de datos. Sospeché que los permisos de los archivos eran los culpables, pero incluso con la base de datos que proporciona acceso completo (chmod 777), el problema persiste. ¿Debo intentar cambiar el propietario del archivo? Si es así, ¿qué?SQLite/PHP de solo lectura?
Por cierto, mi máquina es la instalación estándar de Mac OS X Leopard con PHP activado.
@ Tom Martin
Gracias por su respuesta. Acabo de ejecutar su código y parece que PHP se ejecuta como usuario _www. Luego intenté cambiar la base de datos para que fuera propiedad de _www, pero tampoco funcionó.
También debería tener en cuenta que la función errorInfo de PDO no indica que se haya producido un error. ¿Podría ser una configuración con PDO de alguna manera abriendo la base de datos para solo lectura? Escuché que SQLite realiza bloqueos de escritura en todo el archivo. ¿Es posible que la base de datos esté bloqueada por algo más que impida la escritura?
He decidido incluir el código en cuestión. Este va a ser más o menos un puerto de Grant's script a PHP. Hasta ahora es solo 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>";
?>
Lo siento, hombre, no puedo ayudarlo más. Aún suena como un problema de permisos, si puedes hacer que funcione desde el shell. –
Gracias de todos modos. A mí también me parece una cuestión de permisos, pero no veo cómo es posible aquí. –
Probado cambiando '$ db = new PDO ('sqlite: test.db');' a una ruta completa? Me gusta .. '$ db = new PDO ('sqlite: /tmp/test.db');'? – dbr