使用PDO在SQLite数据库上插入/更新查询适用于本地,但无法在线静默

时间:2011-06-16 08:34:34

标签: php sql sqlite pdo

我注意到以下非常奇怪的行为。我使用PDO将数据从webform插入/更新到SQL数据库。我有许多不同的页面,其中一些包含图像上传字段。

现在奇怪的是:我使用以下方法插入/更新数据库:

// For one of the pages with an image upload (works perfectly on localhost as well as on a server):

// For a new insert
$query = "INSERT INTO ZCATEGORIES (ZIMAGE, ZIMAGETYPE, ZNAME, ZCOLOR) VALUES ('?', 'image/png', 'newCat', '#F78A9FF')"; 

// When there is already something in the db under the id Z_PK
$query = "UPDATE ZCATEGORIES SET ZIMAGE='?', ZIMAGETYPE='image/png', ZNAME='newCat', ZCOLOR='#F78A9FF', WHERE Z_PK='1'";
$sth = $db->prepare($query);          // $query is a correctly formatted SQL query string, I have checked that thoroughly

// Image validation is done earlier on the page
if (is_uploaded_file($_FILES[$fieldname]['tmp_name'])
    $img = file_get_contents($_FILES[$fieldname]['tmp_name']);
    $sth->bindParam(1, $img, PDO::PARAM_LOB);
}

$db->beginTransaction();
$sth->execute();
$db->commit();
$sth->closeCursor();

以下原因导致问题:

// For one of the pages without an image upload (works on localhost but NOT on a server):

// For a new insert
$query = "INSERT INTO ZCUSTOM (ZFONT, ZTEXTCOLOR, ZBUTTONCOLOR, ZBUTTONTEXTCOLOR) VALUES ('Monaco', '#FF0000', '#1CFF49', '#F78A9FF')"; 

// When there is already something in the db
$query = "UPDATE ZCUSTOM SET ZFONT='Monaco', ZTEXTCOLOR='#FF0000', ZBUTTONCOLOR='#1CFF49', ZBUTTONTEXTCOLOR='#F78A9FF'";
$sth = $db->prepare($query);          // $query is a correctly formatted SQL query string, I have checked that thoroughly

$db->beginTransaction();
$sth->execute();
$db->commit();
$sth->closeCursor();

但是这个在本地主机和服务器上再次运行

// For one of the pages without an image upload (works both on localhost and on a server):

// For a new insert
$query = "INSERT INTO ZCUSTOM (ZFONT, ZTEXTCOLOR, ZBUTTONCOLOR, ZBUTTONTEXTCOLOR) VALUES ('Monaco', '#FF0000', '#1CFF49', '#F78A9FF')"; 

// When there is already something in the db
$query = "UPDATE ZCUSTOM SET ZFONT='Monaco', ZTEXTCOLOR='#FF0000', ZBUTTONCOLOR='#1CFF49', ZBUTTONTEXTCOLOR='#F78A9FF'";
$db->query($query);

现在上面的方法在我的localhost上完美运行。包含文本输入的页面和包含文本的页面以及图像都成功地存储在数据库中。但是,尝试在Web服务器上插入/更新数据库时会出现问题。然后由于某种原因,包含文本和图像数据的页面上的表单提交仍然像预期的那样工作。但是,在仅包含文本数据的页面上没有任何内容插入到数据库...

经过几个小时拼命尝试不同的事情后,我决定用简单的方式在这些麻烦的页面上交换整个准备,开始事务,执行...程序

$db->query($query);

令我惊讶的是,现在它在网上运行良好!这里有什么我想念的吗?我不明白为什么这个特殊问题与在本地或通过网络服务器进行尝试有关...为什么它应该在我的本地主机上完美运行,但会导致在线问题?奇怪的是,仅适用于ceratin页面?我已经检查过db和它所在的文件夹都是可读写的。我在Mac OSX 10.6.7上运行PHP版本5.3.4

如果有人知道可能导致问题的原因,请分享。我将非常感激。

1 个答案:

答案 0 :(得分:0)

  

我已经检查了db和   它所在的文件夹都是可读的   可写的。

我设法通过使到数据库的整个路径(至少从您的主目录)可读 来解决类似的问题可执行文件,除了使DB文件夹可读和可写。

注意:我说的是在本地计算机上更改服务器的权限,不是。)

例如,如果您的网站位于

~/Sites/mysite

,您的数据库位于

~/Sites/mysite/db/main.db

您可以在BASH中使用以下命令来设置适当的权限:

$ chmod a+xr ~/Sites
$ chmod a+xr ~/Sites/mysite
$ chmod -R a+xrw ~/Sites/mysite/db/

希望这会有所帮助。