PDO警告和未定义方法myclassname :: bindParams()

时间:2012-07-19 03:59:19

标签: php oop pdo

我从一个我之前正在研究的项目开始。借助我的PHP书和Stack Overflow上的一些人,我能够摆脱我遇到的很多错误。

现在,我留下了警告和致命错误。我理解这两个错误,我只是不确定如何解决我得到的错误。有人可以帮忙吗?我要求任何人编写代码或只为我做一切,我只需要一个正确的方向。

这是警告,听起来我需要将__construct放在uploadFile()方法的某个地方,但同样不确定:

  

警告:PDO :: prepare()[pdo.prepare]:SQLSTATE [00000]:没有错误:PDO   没有在C:\ xampp \ htdocs \ files \ upload.php中调用构造函数   23

第二,我完全不知道该怎么做。我意识到错误告诉了我什么,我只是不知道从哪里开始修复它。这是:

  

致命错误:调用未定义的方法upload :: bindParam()   第24行的C:\ xampp \ htdocs \ files \ upload.php

如果我能提供更多信息可以让您更容易回答,请告诉我,我会尽力为您服务。我感谢任何帮助!

upload.php的

  <?php
error_reporting(E_ALL);
require('config.php');

class upload extends PDO
{
    public $conURL, $filename, $tmpname, $filesize, $filetype, $file;

    public function __construct($config) {
        $conURL = "mysql:host=" . $config['host'] . ";dbname=" . $config['db'];
        parent::__construct($conURL, $config['user'], $config['pass']);

    }       

    public function uploadFile() {
        if ($_FILES['file']['size'] >= 2000000) {
           echo "File is too large!"; 
        }
        else {
            $sth = $this->prepare("INSERT INTO uploads (name, type, size, file) VALUES (?, ?, ?, ?)");
            $sth->bindParam(1, $filename);
            $sth->bindParam(2, $filetype);
            $sth->bindParam(3, $filesize);
            $sth->bindParam(4, $file);
            $sth->execute();
        }
    }
}

$upload = new upload($config);

$upload->filename = $_FILES['file']['name'];
$upload->tmpname = $_FILES['file']['tmp_name'];
$upload->filesize = $_FILES['file']['size'];
$upload->filetype = $_FILES['file']['type'];    
$upload->file = $_FILES['file'];


$upload->uploadFile();

的config.php

<?php
$config = array(
        'host' => 'localhost', // db host
        'user' => 'root', // db user
        'pass' => '', //db pass
        'db' => 'files' // db name
);

编辑:感谢大家在这里,只剩下一个错误,它是以下内容:

  

致命错误:调用未定义的方法stdClass :: uploadFile()in   第43行的C:\ xampp \ htdocs \ files \ upload.php

编辑2:所有错误都已解决,但没有任何内容插入数据库。

3 个答案:

答案 0 :(得分:1)

好吧2个人指出了另一个问题,但这里真正指出的是你正在调用PDO子类的bindParam。这需要pdostatement安装。尝试:

        $sth = $this->prepare("INSERT INTO uploads (name, type, size, file) VALUES (?, ?, ?, ?)");
        $sth->bindParam(1, $this->filename);
        $sth->bindParam(2, $this->filetype);
        $sth->bindParam(3, $this->filesize);
        $sth->bindParam(4, $this->file);
        $sth->execute();

当然,您还需要在构造函数中修复以下错误。

编辑:

我猜构造函数失败并抛出异常。因为$ this-&gt; conURL为null。变化

$conURL = "mysql:host=" . $config['host'] . ";dbname=" . $config['db'];

$this->conURL = "mysql:host=" . $config['host'] . ";dbname=" . $config['db'];

我也改变了之前的答案,请参阅bindparam()的第二个参数。

答案 1 :(得分:0)

您的构造函数应如下所示:

public function __construct($config) {
        $conURL = "mysql:host=" . $config['host'] . ";dbname=" . $config['db'];
        try {
            parent::__construct($conURL, $config['user'], $config['pass']);
        } catch (PDOException $e) {
            $e->getMessage();
        }
}  

甚至

public function __construct($config)
{
    $conURL = "mysql:host=" . $config['host'] . ";dbname=" . $config['db'];
    parent::__construct($conURL, $config['user'], $config['pass']);
}  

答案 2 :(得分:0)

因为您正在扩展PDO,所以

return new PDO($this->conURL, $config['user'], $config['pass']);

应该是

parent::__construct($this->conURL, $config['user'], $config['pass']);