【问题标题】:Table not created when using class method [closed]使用类方法时未创建表[关闭]
【发布时间】:2022-01-04 14:42:53
【问题描述】:

您好,我创建了以下工作。我对此很陌生,看不出为什么第二个代码不起作用。任何建议都将受到欢迎。

class Dbcon {
    private $severname;
    private $username;
    private $password;
    private $dbname;
    private $charset;
 
 
public function connect () {
 
$this->servername ='localhost';
$this->username = 'ucmsadmin';
$this->password = 'P@xxwxrdxxx';
$this->dbname = 'umcs';
$this->charset = 'utmf8mb4';
 
 
 try {
 
 
$dsn = "mysql:host=".$this->severname.";dbname=".$this->dbname.";charset".$this->charset;
$pdo = new PDO($dsn , $this->username, $this->password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO:: ERRMODE_EXCEPTION);
echo "Connected";
 
 
$queryCreateUsersTable = "CREATE TABLE IF NOT EXISTS `USERS` (
    `ID` int(11) unsigned NOT NULL auto_increment,
    `USER_NAME` varchar(255) NOT NULL default '',
    `EMAIL` varchar(255) NOT NULL default '',
    `PASSWORD` varchar(255) NOT NULL default '',
    `ACCESS_LEVEL` tinyint(1) unsigned NOT NULL default '1',
    `ACCOUNT_APPROVED` boolean NOT NULL default '0',
    
    PRIMARY KEY  (`ID`))";
 
if(!$pdo->query($queryCreateUsersTable)){
    echo "Table creation failed: (" . $pdo->errno . ") " . $pdo->error;
 
} else {
    echo' table created';
}
 
return $pdo;
 
 } catch (PDOException $e) {
 echo "connection failed: ".$e->getMessage();
 
 }
}
}

但是,如果我将创建数据库表的部分移到公共函数中,我不会收到任何错误,但不会创建表。这就是我所做的;

class Dbcon {
    private $severname;
    private $username;
    private $password;
    private $dbname;
    private $charset;
 
 
public function connect () {
 
$this->servername ='localhost';
$this->username = 'ucmsadmin';
$this->password = 'P@33w0rd101';
$this->dbname = 'umcs';
$this->charset = 'utmf8mb4';
 
 
 try {
 
 
$dsn = "mysql:host=".$this->severname.";dbname=".$this->dbname.";charset".$this->charset;
$pdo = new PDO($dsn , $this->username, $this->password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO:: ERRMODE_EXCEPTION);
echo "Connected";
 
 
return $pdo;
 
 } catch (PDOException $e) {
 echo "connection failed: ".$e->getMessage();
 
 }
}
 
public function createtable() {
    $this->connect();
    $queryCreateUsersTable = "CREATE TABLE IF NOT EXISTS `USERS` (
    `ID` int(11) unsigned NOT NULL auto_increment,
    `USER_NAME` varchar(255) NOT NULL default '',
    `EMAIL` varchar(255) NOT NULL default '',
    `PASSWORD` varchar(255) NOT NULL default '',
    `ACCESS_LEVEL` tinyint(1) unsigned NOT NULL default '1',
    `ACCOUNT_APPROVED` boolean NOT NULL default '0',
    
    PRIMARY KEY  (`ID`))";
    return $queryCreateUsersTable;
 
}
}

在我运行的 index.php 中

include('classes/dbclass.php');
$object = new Dbcon;
$object->connect();
$object2 = new Dbcon;
$object2->createTable();?> 

【问题讨论】:

  • 我看到的一个问题是您创建并使用了$this->severname,但您将 localhost 分配给了$this->servername——一个小错字会产生很大的不同。
  • 您在createtable 中返回查询字符串,但您从未像第一次尝试那样在数据库中实际运行它。
  • 您的第二个版本什么都不做:connect() 方法返回 PDO 实例,createTable() 只返回 SQL 查询。

标签: php class methods pdo


【解决方案1】:

createTable() 函数只是定义了一个包含一些 SQL 的字符串。它永远不会将该 SQL 发送到要执行的数据库。

在原代码的基础上,你可以写成这样:

public function createtable() {
    $pdo = $this->connect();
    $queryCreateUsersTable = "CREATE TABLE IF NOT EXISTS `USERS` (
    `ID` int(11) unsigned NOT NULL auto_increment,
    `USER_NAME` varchar(255) NOT NULL default '',
    `EMAIL` varchar(255) NOT NULL default '',
    `PASSWORD` varchar(255) NOT NULL default '',
    `ACCESS_LEVEL` tinyint(1) unsigned NOT NULL default '1',
    `ACCOUNT_APPROVED` boolean NOT NULL default '0',
    PRIMARY KEY  (`ID`))";

    if(!$pdo->query($queryCreateUsersTable)){
      echo "Table creation failed: (" . $pdo->errno . ") " . $pdo->error;
    } else {
      echo' table created';
    }
}

但是我要指出,每次运行查询时都创建一个新连接是非常低效的。相反,您应该尝试在 PHP 脚本的生命周期内创建一次连接,并继续重复使用它。

【讨论】:

  • 太棒了,谢谢,我现在看到没有运行查询:) 谢谢。感谢您关于创建连接一次的建议,一定会接受您的建议,谢谢。
猜你喜欢
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-02
相关资源
最近更新 更多