Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLite/PHP只读?_Php_Sqlite_Permissions_Pdo - Fatal编程技术网

SQLite/PHP只读?

SQLite/PHP只读?,php,sqlite,permissions,pdo,Php,Sqlite,Permissions,Pdo,我一直在尝试将SQLite与PHP中的PDO包装器一起使用,但成功率参差不齐。我可以很好地从数据库中读取数据,但在浏览器中查看页面时,没有任何更新提交到数据库。奇怪的是,从我的shell运行脚本确实会更新数据库。我怀疑文件权限是罪魁祸首,但即使数据库提供完全访问(chmod777),问题仍然存在。我应该尝试更改文件所有者吗?如果是,该怎么办 顺便说一下,我的机器是标准的Mac OS X Leopard安装,PHP激活 @汤姆·马丁 谢谢你的回复。我刚刚运行了你的代码,看起来PHP是以用户www的

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

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

@汤姆·马丁

谢谢你的回复。我刚刚运行了你的代码,看起来PHP是以用户www的身份运行的。然后我尝试将数据库更改为www所有,但也没有成功

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

我已经决定加入有问题的代码。这或多或少是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>";

?>

我认为PHP通常作为用户“nodody”运行。不过,我不太清楚Mac上的情况。如果Mac有whoami,您可以尝试
echo exec('whoami')来找出答案。

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

此外,我看到您在循环中执行多个选择。如果你正在建造一些小而不重的东西,这可能是可以的。否则,我建议构建一个返回多行的查询,并在单独的循环中处理它们。

@Tom 取决于主机的设置方式,如果服务器将PHP作为Apache模块运行,那么它很可能是“无人”(通常是Apache设置为的任何用户)。但是,如果将PHP设置为cgi(如fast cgi),并且服务器运行SuExec,那么PHP将作为拥有文件的同一用户运行

因此,包含数据库的文件夹必须是可由脚本写入的,可以是同一用户,也可以是对php用户设置了写入权限

@米哈尔
除此之外,可以使用beginTransaction();执行所需的所有操作,然后comit();让他们来

好吧,我现在也遇到了同样的问题,但我错了:只需将插入的每条SQL指令放入它所在的
try…catch
块中。这会让你做得很好,否则就不行了。嗯,现在可以了。祝有此问题的其他人好运(因为我自己使用此线程来解决我的问题)。

对于那些在OS X上遇到SQLite只读问题的人:

1) 确定Apachehttpd用户及其所属的组:

grep“^User”/private/etc/apache2/httpd.conf
团体(www

2) 在/Library/WebServer/Documents中为数据库创建子目录,并将组更改为httpd的组:

sudo chgrp_www/Library/WebServer/Documents/db

一个不太安全的选项是打开/Library/WebServer/Documents上的权限:

sudo chmod a+w/Library/WebServer/Documents


我在“存放数据库文件的文件夹必须可写”上找到了答案。

对不起,我不能再帮你了。尽管如此,如果你能从shell中得到它,听起来仍然像是一个权限问题。无论如何,谢谢。对我来说,这似乎也是一个权限问题,但我不认为这在这里是可能的到完整路径?像<代码>$db=newpdo('sqlite:/tmp/test.db')?刚试过,没什么区别。谢谢你的建议,你修好了!非常感谢。该脚本或多或少是Grant脚本的逐行副本,Grant脚本以这种方式执行其SQL语句。然而,我正在考虑做一个O(1)选择,将更新排队,并在最后执行它们。我只想表达我的感谢,我从来没有想到这是答案。我使用的是SQLite3(没有PDO),这对我帮助很大。PS:我记得OSX附带的“标准”apache/php安装即使是10.5(桌面,而不是服务器)也只是PHP4,如果你想要PHP5的好处,你实际上必须重新编译php(请注意,重新编译Apache,以获得Apache+PHP+MySQL设置中常见的更多功能)。