SQLite / PHP只读?

SQLite / PHP只读?

SQLite/PHP read-only?

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

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

@汤姆·马丁

谢谢您的回复。我只运行了您的代码,看起来PHP以用户_www的身份运行。然后,我尝试将数据库归于_www所有,但这也不起作用。

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

我已决定包括相关代码。这将或多或少地将Grant的脚本移植到PHP。到目前为止,这只是"问题"部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<?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">(-?\\d*).*?\\/questions\\/(\\d*).*?>(.*?)<\\/a>/s';
preg_match_all($qreg, $page, $questions, PREG_SET_ORDER);

$areg = '/(answer-summary">(-?\\d+).*?href.*?>(.*?)<.a)/s';
preg_match_all($areg, $page, $answers, PREG_SET_ORDER);

echo"Questions:\
"
;
echo"<table cellpadding=\"3\">\
"
;

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\
"
;
        $db->exec($query);
        $lastQ ="(NEW)";
    }
    echo"<tr><td>$lastQ</td><td align=\"right\">$q[1]</td><td>$q[3]</td></tr>\
"
;
}

echo"</table>";

?>


凯尔(Kyle),为了使PDO / Sqlite工作,您需要对数据库所在目录具有写许可权。

另外,我看到您在循环中执行多个选择。如果您要构建的东西很小而不是很重,那可能没问题。否则,我建议构建单个查询以返回多个行并在单独的循环中对其进行处理。


我在PHP手册"包含数据库文件的文件夹必须是可写的"中找到了答案。


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

1)确定Apache httpd用户和该用户所属的组:

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

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

sudo chgrp _www /Library/WebServer/Documents/db

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

sudo chmod a+w /Library/WebServer/Documents


我认为PHP通常以用户" nodody"的身份运行。虽然不确定在Mac上。如果Mac具有whoami,则可以尝试echo exec('whoami');进行查找。


好吧,我现在遇到了同样的问题,并通过一个错误解决了这个问题:只需将每个插入的SQL指令放在一个try...catch块中即可。它使您以正确的方式进行操作,否则将无法正常工作。好吧,现在可以了。对于遇到此问题的其他人,祝您好运(因为我自己使用此线程来尝试解决我的问题)。


汤姆
取决于托管的设置方式,如果服务器将PHP作为Apache模块运行,则它很可能是"没人"(通常将任何用户apache设置为)。但是,如果将PHP设置为cgi(例如fast-cgi),并且服务器运行SuExec,则php将以拥有文件的同一用户身份运行。

无论哪种方式,包含该数据库的文件夹都必须是脚本可写的,或者是同一用户,或者是将写权限设置为php用户。

@米哈尔
除此之外,可以使用beginTransaction();。执行所有需要的操作,然后comit();真正承认他们。


推荐阅读

    浏览器调用linux命令?

    浏览器调用linux命令?,系统,信息,人工智能,软件,数据,首次,地址,代码,咨询,

    linux命令大全数据库?

    linux命令大全数据库?,服务,系统,平台,状态,软件,通用,环境,数据,神州,地址,

    linux脚本多个命令?

    linux脚本多个命令?,系统,工作,标准,服务,命令,软件,管理,连续,电脑,设备,lin

    linux上数据库的命令?

    linux上数据库的命令?,服务,系统,信息,地址,命令,密码,工具,管理,数据,单位,

    linux命令dm数据库?

    linux命令dm数据库?,地址,软件,时间,设备,名字,服务,位置,名称,公司,命令,lin

    linux命令读取前十个?

    linux命令读取前十个?,时间,系统,最新,文件,名称,标准,密码,工作,适当,信息,l

    linux脚本注释命令?

    linux脚本注释命令?,代码,系统,工作,名称,地方,脚本,命令,信息,状态,简介,lin

    脚本运行linux命令?

    脚本运行linux命令?,系统,环境,工具,工作,位置,底部,代码,发行,官网,终端,lin

    linux安装浏览器命令?

    linux安装浏览器命令?,官网,系统,平台,网站,管理,设备,咨询,工具,官方网站,

    linux读取码值命令?

    linux读取码值命令?,系统,工作,地址,证书,命令,工具,档案,文件,设计,信息,基

    linux命令下写脚本?

    linux命令下写脚本?,服务,系统,环境,代码,名称,命令,脚本,发行,在线,情况,三

    linux把命令变成脚本?

    linux把命令变成脚本?,系统,环境,工作,脚本,命令,信息,基础,代码,文件,变量,

    linux数据库查找命令?

    linux数据库查找命令?,位置,名称,状态,服务,软件,信息,系统,命令,名字,密码,

    脚本调用linux命令?

    脚本调用linux命令?,代码,系统,工作,底部,脚本,位置,环境,行用,官网,标准,typ

    linux数据库同步命令?

    linux数据库同步命令?,信息,系统,汽车,车辆,服务,工作,通信,一致,分析,数据,D

    linux脚本命令输信息?

    linux脚本命令输信息?,系统,信息,代码,脚本,数据,工具,发行,命令,变量,文件,l

    linux上启动脚本命令?

    linux上启动脚本命令?,服务,状态,系统,代码,脚本,工作,周期性,命令,文件,方

    linux浏览网页的命令?

    linux浏览网页的命令?,工作,系统,传播,地址,命令,环境,发行,信息,网络,基础,l

    linux建立数据库命令?

    linux建立数据库命令?,软件,系统,工作,数据,密码,工具,数据库,一致,网络,服

    linux命令进数据库?

    linux命令进数据库?,地址,系统,名字,服务,密码,命令,读法,数据库,操作系统,