我注意到以下非常奇怪的行为。我使用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();
但这可以在localhost和服务器上再次运行
// 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
如果有人知道可能导致问题的原因,请分享。我会很感激。
我已经检查过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/
希望这可以帮助。