Php 对非对象调用成员函数rollback()
出于测试目的,我在办公室运行localhost XAMPP服务器。我正在旅行,决定在我的笔记本电脑上完成一些工作,所以我在笔记本电脑上安装了一个新版本的XAMPP,复制了我的文件,但由于某种原因,我的笔记本电脑版本出现了不间断的错误,而我的桌面上没有一个 其中一个大问题是我的一个站点的简单登录页面 每次尝试运行代码时,都会出现以下错误: 对成员函数rollback()的调用 关于非对象 我的代码是:Php 对非对象调用成员函数rollback(),php,mysql,pdo,Php,Mysql,Pdo,出于测试目的,我在办公室运行localhost XAMPP服务器。我正在旅行,决定在我的笔记本电脑上完成一些工作,所以我在笔记本电脑上安装了一个新版本的XAMPP,复制了我的文件,但由于某种原因,我的笔记本电脑版本出现了不间断的错误,而我的桌面上没有一个 其中一个大问题是我的一个站点的简单登录页面 每次尝试运行代码时,都会出现以下错误: 对成员函数rollback()的调用 关于非对象 我的代码是: <?php session_start(); if( $_SERVER[
<?php
session_start();
if( $_SERVER['SERVER_PORT'] == 80) {
header('Location:https://'.$_SERVER['HTTP_HOST'].$_SERVER["REQUEST_URI"]);
die();
}
try
{
$db = new PDO('mysql:host=localhost;dbname=DB', 'USER', 'PW');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->beginTransaction();
$sql = $db->prepare("SELECT user, pw FROM table WHERE user=? AND pw=?");
$sql->execute(array($_POST['user'], $_POST['pw']));
$foundrows = $db->query("SELECT FOUND_ROWS()")->fetchColumn();
$rows = $sql->fetchAll();
foreach($rows as $row) {
$username = $row[0];
$pw = $row[1];
}
$db->commit();
$db->NULL;
}
catch (PDOException $e)
{
$db->rollback();
echo $e->getMessage();
exit;
}
if ($foundrows == 1) {
(store stuff and exit to Page A)
} else {
(create error and return to login page)
}
?>
正如我之前所说的,在我的桌面上(以及我在其他地方使用的几个实时站点上)运行这个功能没有问题。怎么回事
注意:我认为可能是我的PHP文件的不同配置,但我从桌面复制了PHP.ini文件,仍然没有成功…您的代码表明
$db->rollback()
失败,因为尚未定义$db
。让我们看一下您的代码片段:
try
{
$db = new PDO('mysql:host=localhost;dbname=DB', 'USER', 'PW');
[snip]
}
catch (PDOException $e)
{
$db->rollback();
echo $e->getMessage();
exit;
}
我认为您的代码甚至没有通过catch
块中的第一条语句,即在PDO
构造函数中抛出异常。要测试这一点,请移动echo$e->getMessage代码>在$db->rollback()上,或有条件地执行回滚:
catch (PDOException $e)
{
if ($db) {
$db->rollback();
}
echo $e->getMessage();
exit;
}
为了更全面地解决这个问题,请仔细检查您的数据库设置——也许在从一台服务器移动到另一台服务器时发生了错误?echo$e->getMessage();”的输出是什么?在脚本终止之前,也许你必须将它向上移动一行以获取它。@JochenJung-没有输出,而且,向上移动也没有任何作用。函数正在处理一个问题@$db->rollback();当然向上移动,可能会给你其他信息。你试过了吗?由于您的错误,尝试块失败$db beeing not defined(您现在看到的错误消息)就是这种情况的结果。但是现在您将看不到$e->getMessage(),因为脚本在前面的行中终止。