我有一个奇怪的问题,当代码在另一个文件上工作时,我无法在SQLite数据库文件上执行最简单的查询。创建新的PDO实例时没有错误。该权限仅用于只读目的(644)。
try
{
$dbh = new PDO("sqlite:$db");
}
catch(PDOException $e)
{
echo $e->getMessage();
echo "Database not loaded successfully. ";
die();
}
但是当我跑步时:
$sth = $dbh->prepare('select * from message');
$result = $sth->execute();
或
$result = $dbh->query('select * from message');
都返回FALSE
。
它抛出错误:“致命错误:未捕获异常'PDOException',消息'SQLSTATE [HY000]:常规错误:14无法在$dbh->prepare
行上打开数据库文件。
同样,上面的代码在另一个数据库文件上运行正常。
另一个信息:我可以在MesaSQLite(Mac上的SQLite文件查看器)中正常打开有问题的文件。
我会错过什么吗?
答案 0 :(得分:0)
我使用这样的东西。不知道它是否会有所帮助
<?php
try {
// create a new instance of a PDO connection
$db = new PDO("sqlsrv:Server=localhost;Database=myDatabase", $username, $password);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql='SELECT * FROM message';
$stmt = $db->prepare($sql);
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
foreach($rows as $row) {
echo "<pre>";var_dump($row);echo"</pre>";
}
}
catch(PDOException $e) {
// if the connection fails, display an error message
echo 'ERROR: ' . $e->getMessage();
$errmsg = $e->getMessage();
error_log('$errmsg-> '.$errmsg);
}
答案 1 :(得分:0)
他们返回false是有充分理由的,当发生这种情况时你必须检查错误,然后修复它们:
使用prepare()
:
try
{
$dbh = new PDO("sqlite:$db");
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$sth = $dbh->prepare('select * from message');
if(!$sth) {
echo "prepare failed() :\n";
print_r($dbh->errorInfo());
die();
}
$success = $sth->execute();
if(!$success) {
echo "execute failed() :\n";
print_r($dbh->errorInfo());
die();
}
$result = $sth->fetchAll();
var_dump($result);
}
catch(PDOException $e)
{
echo "PDO Exception caught: ";
echo $e->getMessage();
die();
}
使用query()
:
try
{
$dbh = new PDO("sqlite:$db");
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$sth = $dbh->query('select * from message');
if(!$sth) {
echo "query() failed :\n";
print_r($dbh->errorInfo());
die();
}
$result = $sth->fetchAll();
if($result) {
var_dump($result);
}else{
echo "No result !";
}
}
catch(PDOException $e)
{
echo "PDO Exception caught: ";
echo $e->getMessage();
die();
}
在创建连接时设置错误模式:
$dbh = new PDO("sqlite:$db", null, null,
array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION));