문제

나는 PHP에서 PDO 래퍼와 함께 SQLite를 사용하려고 노력해 왔으며 혼합된 성공을 거두었습니다.데이터베이스에서 읽을 수는 있지만 브라우저에서 페이지를 볼 때 업데이트 중 어느 것도 데이터베이스에 커밋되지 않습니다.흥미롭게도 내 쉘에서 스크립트를 실행하면 데이터베이스가 업데이트됩니다.파일 권한이 원인이라고 의심했지만 데이터베이스가 전체 액세스(chmod 777)를 제공하더라도 문제가 지속됩니다.파일 소유자를 변경해 볼까요?그렇다면 어떻게 해야 할까요?

그건 그렇고, 내 컴퓨터는 PHP가 활성화된 표준 Mac OS X Leopard 설치입니다.

@톰 마틴

당신의 답변에 감사드립니다.방금 코드를 실행했는데 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>";

?>
도움이 되었습니까?

해결책

Kyle, PDO/Sqlite가 작동하려면 데이터베이스가 있는 디렉토리에 대한 쓰기 권한이 필요합니다.

또한 루프에서 여러 선택을 수행하는 것을 확인했습니다.작고 무겁지 않은 것을 만드는 경우에는 괜찮을 수 있습니다.그렇지 않으면 여러 행을 반환하고 이를 별도의 루프에서 처리하는 단일 쿼리를 작성하는 것이 좋습니다.

다른 팁

나는 그 답을 에서 찾았다. PHP 매뉴얼 "데이터베이스 파일이 들어 있는 폴더는 쓰기 가능해야 합니다."

나는 PHP가 일반적으로 "nodody" 사용자로 실행된다고 생각합니다.하지만 Mac에서는 확실하지 않습니다.Mac에 whoami가 있으면 시도해 볼 수 있습니다. echo exec('whoami'); 알아보기 위해.

OS X에서 SQLite에 대한 읽기 전용 문제가 발생한 경우:

1) 아파치 결정 httpd 사용자 및 사용자가 속한 그룹:

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

2) 하위 디렉터리를 생성합니다. /라이브러리/웹서버/문서 데이터베이스에 대해 그룹을 httpd 그룹으로 변경합니다.

sudo chgrp _www /Library/WebServer/Documents/db

덜 안전한 옵션은 다음에 대한 권한을 여는 것입니다. /라이브러리/웹서버/문서:

sudo chmod a+w /Library/WebServer/Documents

@TOM은 호스팅이 설정되는 방식에 따라 다릅니다. 서버가 PHP를 Apache 모듈로 실행하면 '아무도 없다'(일반적으로 사용자 APACHE가 설정되면).그러나 PHP가 cgi(예: fast-cgi)로 설정되고 서버가 SuExec을 실행하는 경우 PHP는 파일을 소유한 동일한 사용자로 실행됩니다.

어느 쪽이든 데이터베이스를 포함할 폴더는 동일한 사용자이거나 PHP 사용자에게 쓰기 권한을 설정하여 스크립트로 쓸 수 있어야 합니다.

@michal 그 제쳐두고, begintransaction ()을 사용할 수 있습니다.필요한 모든 작업을 수행한 다음 comit();실제로 그들을 comit합니다.

글쎄, 나는 지금 같은 문제가 있었고 실수로 그것을 알아 냈습니다.SQL 명령어의 모든 삽입 부분을 try...catch 가는 것을 차단합니다.그것은 당신이 올바른 방법으로 일하게 만듭니다. 그렇지 않으면 작동하지 않습니다.이제 작동합니다.이 문제가 있는 다른 사람에게도 행운이 있기를 바랍니다(저는 이 스레드를 사용하여 문제를 해결하려고 했습니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top