gpt4 book ai didi

php - SQLite/PHP 只读?

转载 作者:IT王子 更新时间:2023-10-29 06:21:18 28 4
gpt4 key购买 nike

我一直在尝试将 SQLite 与 PHP 中的 PDO 包装器一起使用,但取得了不同程度的成功。我可以很好地从数据库中读取,但是当我在浏览器中查看页面时,我的更新都没有提交到数据库。奇怪的是,从我的 shell 运行脚本确实更新了数据库。我怀疑文件权限是罪魁祸首,但即使数据库提供了完全访问权限 (chmod 777),问题仍然存在。我应该尝试更改文件所有者吗?如果是,怎么办?

顺便说一句,我的机器是标准的 Mac OS X Leopard 安装并激活了 PHP。

@汤姆马丁

感谢您的回复。我刚刚运行了您的代码,看起来 PHP 作为用户 _www 运行。然后我尝试将数据库归 _www 所有,但这也没有用。

我还应该注意,PDO 的 errorInfo 函数并不表示发生了错误。这可能是 PDO 以某种方式打开数据库为只读的设置吗?我听说 SQLite 对整个文件执行写锁定。数据库是否可能被其他阻止写入的东西锁定?

我决定包含有问题的代码。这将或多或少成为 Grant's script 的一个端口。到 PHP。到目前为止,它只是问题部分:

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

?>

最佳答案

Kyle,为了让 PDO/Sqlite 工作,您需要对数据库所在的目录有写权限。

此外,我看到您在循环中执行多项选择。如果您正在构建小型且负载不重的东西,这可能没问题。否则我建议构建返回多行的单个查询并在单独的循环中处理它们。

关于php - SQLite/PHP 只读?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61085/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com