【问题标题】:Insert data using database class and function and getting error " call to member function Prepare() on string...database->insert("category",Array)使用数据库类和函数插入数据并获取错误“调用字符串上的成员函数 Prepare()...database->insert("category",Array)
【发布时间】:2020-12-15 07:01:57
【问题描述】:

在将我的问题标记为重复之前,请给出我能理解的任何示例或链接,我正在学习 PHP。希望你能理解。

我正在尝试使用 database_class 和插入函数插入数据。

这是我的数据库类。

//db_class.php
class database {

    var $_sql           = '';   
    var $_resource      = '';
    var $_result        = '';
    var $_insertId      = ''; 

    function connect() {
            
            global $glob;

        $host = $glob['localhost'];
        $user = $glob['root'];
        $pass = $glob[''];
        $db = $glob['crestdb'];
        
        try {
            $this->_resource = new PDO('mysql:host='.$host.';port=3306;dbname='.$db.'', $user, $pass);
            $this->_resource->query("SET SQL_BIG_SELECTS=1");
        } catch (PDOException $e) {
            print "Error!: " . $e->getMessage() . "<br/>";
            die();
        }   
    }

    function insert($table, $dbFields) {
    
        $field = array();
        $value = array();
        
        foreach ( $dbFields as $k => $v) {
            //$v = addslashes(stripslashes($v));
            $v = (stripslashes($v));
            $field[] = $k;
            $qmark[] =":".$k;
            $value[":".$k] = $v;            
        }

        $f = implode('`,`',$field);
        $val = implode("','",$value);
        $q = implode(",",$qmark);
        
        $insertSql = "INSERT INTO `$table` (`$f`) VALUES ($q)"; 
            
        $stmt = $this->_resource->prepare($insertSql);
        $stmt->execute($value);
        $_result=$this->_resource->lastInsertId();
        $this->_insertId=$_result;
        return $_result;
        
    }

并且正在使用它 addcat.php

include( "db_class.php");

$obj = new database(); 

if(isset($_POST['submit'])){

$dbFields = array(
                 'cname' => $_POST['cname'],
                 'priority' =>$_POST['priority'],
                 'status' =>  $_POST['status'],           
           );
$obj->insert("category",$dbFields);
}

根据我的 TITLE 建议,使用这个我得到了错误。 我想我在 addcat.php 中犯了错误我是否错误地调用了这个函数?

这是错误:- 未捕获的错误:调用 C:\xampp\htdocs\def\database.class.php:82 中的字符串上的成员函数 prepare() 堆栈跟踪:#0 C:\xampp\htdocs \def\addcat.php(42): database->insert('category', Array) #1 {main} 在C:\xampp\htdocs\def\database.class.php 上线

【问题讨论】:

  • $_resource = '' 所以它是一个字符串,你需要在使用-&gt;prepare之前更改它
  • 您可能希望将connect() 更改为__construct(),以便在您实例化类时创建连接。
  • 可能值得阅读php-fig.org/psr/psr-12 并检查您的代码,因为样式已经过时了。 (类名、var 的用法等)。也尽量避免使用global $glob;之类的东西。
  • @NigelRen,下次我一定会记住的。

标签: php database function class oop


【解决方案1】:

通过在谷歌中搜索很多,我尝试为连接创建不同的类。 和@Felippe 和@Aynber,你们都说得对,我根据你们的建议做了一堂课。

class database{

 var $_resource ;

 var $_result    = '';
 var $_sql       = '';  
 var $_insertId  = '';
 
 var $host = 'localhost';  
 var $user = 'root' ;  
 var $pass = '';  
 var $dbname = 'crestdb';

 var $error;

public function __construct(){  
// Set DSN  
$dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname;  
// Set options  
$options = array(  
PDO::ATTR_PERSISTENT => true,  
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION  
);  
// Create a new PDO instanace  
try{  
$this->_resource = new PDO($dsn, $this->user, $this->pass, $options);  
}  
// Catch any errors  
catch(PDOException $e){  
$this->error = $e->getMessage();  
}  
} 

也许它仍然需要改进,但它现在对我有用!。

【讨论】:

    猜你喜欢
    • 2014-03-19
    • 2019-02-11
    • 1970-01-01
    • 2020-08-04
    • 2019-07-29
    • 2015-09-14
    • 2016-12-18
    • 1970-01-01
    • 2019-06-20
    相关资源
    最近更新 更多