SQLite / PHP-salt okunur?

6 Cevap php

Ben karışık başarı ile PHP PDO sargı ile SQLite kullanmaya çalışıyorum. Ben veritabanı ince okuyabilir, ama ben tarayıcıda sayfayı görüntülemek benim güncellemeleri hiçbiri veritabanına taahhüt ediliyor. İlginçtir, benim kabuk komut dosyasını çalıştırarak veritabanını güncellemek yapar. Ben suçlu olarak dosya izinlerini şüpheli, hatta veritabanı tam erişim (chmod 777) sağlayan sorun devam. Ben dosya sahibini değiştirmeyi denemek mi? Eğer öyleyse, ne?

Bu arada, benim makine standart Mac OS X Leopard aktive PHP ile yüklemelisiniz.

@ Tom Martin

Cevabınız için teşekkür ederim. Ben sadece kodunuzu koştu ve PHP kullanıcı _www olarak çalışır gibi görünüyor. Sonra _www tarafından sahip olunan veritabanı Chowning çalıştı, ancak bu da işe yaramadı.

Ben de PDO'su errorInfo işlevi bir hata gerçekleşti anlamına gelmez dikkat etmelisiniz. Bu PDO şekilde salt okunur için veritabanı açarak bir ayar olabilir mi? Ben SQLite tüm dosya kilitleri yazmak gerçekleştiren duydum. Bu veritabanı yazma engelleyerek başka bir şey tarafından kilitli olması mümkün mü?

Ben söz konusu kod dahil etmeye karar verdik. Bu Grant's script PHP için daha fazla veya daha az bir liman olacak. Şimdiye kadar sadece Sorular bölümü bulunuyor:

<?php

$db = new PDO('sqlite:test.db');

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://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>";

?>

6 Cevap

Kyle, PDO / Sqlite çalışmak için sırayla size veritabanı bulunduğu dizine yazma izni gerekiyor.

Ayrıca, ben döngü içinde birden seçer gerçekleştirmek görmek. Küçük ve ağır yüklü olmayan bir şey yapıyorlar, bu Tamam olabilir. Aksi takdirde birden çok satır döndürür ve ayrı döngü onları süreci tek bir sorgu oluşturma öneririm.

Ben PHP yaygın kullanıcı "nodody" olarak çalışır düşünüyorum. Gerçi Mac konusunda emin değil. Mac deneyebilirsiniz benkimim varsa echo exec('whoami'); bulmak için.

Ben üzerinde cevabı PHP manual "veritabanı dosyasını barındıran klasör yazılabilir olmalıdır." Bulundu

OS X üzerinde SQLite ile salt okunur sorunlar karşılaştı olanlar için:

1) Apache httpd, kullanıcı ve grup kullanıcı aittir belirleyin:

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

2) veritabanı (ler) için /Library/WebServer/Documents bir alt dizin oluşturun ve httpd en grubuna grubunu değiştirmek:

sudo chgrp _www / Library / WebServer / Belgeler / db

Daha az güvenli seçenektir izinlerini açmak için /Library/WebServer/Documents:

sudo bir + w / Library / WebServer / Belgeler chmod

@Tom Depends on how the hosting is setup, If the server runs PHP as an Apache Module then its likely that it is 'nobody' (usually whatever user apache is setup as). But if PHP is setup as cgi (such as fast-cgi) and the server runs SuExec then php runs as the same user who owns the files.

Veritabanı aynı kullanıcı olmanın, ya da php kullanıcıya yazma izni set alarak ya script tarafından yazılabilir olmalıdır içerecek klasörü Her halükarda.

@Michal That aside, one could use beginTransaction(); perform all the actions needed then comit(); to actually comit them.

Eh, ben şimdi aynı sorunu vardı ve bir yanlışlıkla bunu anladım: sadece bir try...catch o gider bloğu içinde SQL öğretimin her takmadan parça koydu. Size doğru yolu aksi takdirde çalışmaz bunu yapar. Eh, şimdi çalışıyor. Bu sorunu ile herkes için iyi şanslar (ben sorunu çözmek için denemek için bu konuyu kendimi kullanılmış gibi).