我对 PHP 面向对象编程非常陌生,所以想知道是否可以就我创建的数据库对象获得一些好的建议。
我调用类db并将我的类包含到每个页面加载中并启动数据库对象using $db = new db
。然后我为我可能需要的每个操作(从数据库构建菜单,获取登录信息等)调用其中的方法,并根据我想要做什么使用不同的参数。
它将它的第一个参数作为带有 ? 的查询。符号作为我要绑定的值的替换,第二个参数是要在数组中绑定到它的值,然后在prepared_statement方法中循环,第三个参数是类型( FETCH_ARRAY 返回一个SELECT语句行的数组, NUM_ROWS 返回受影响的行数,INSERT 返回最后插入的 ID)。
下面是我如何调用此函数的示例:
$db->prepared_execute( "SELECT * FROM whatever WHERE ? = ? ", array( 'password', 'letmein' ), NUM_ROWS );
如果没有要绑定的参数或不需要返回,则第二个和第三个参数是可选的。
由于我是 OOP 的新手,我发现很难准确了解何时正确使用以及什么是公共、私有、静态函数/变量和设计模式(Singleton 等)。
我已经阅读了许多教程以达到我所拥有的程度,但我觉得现在我需要把它带到这里以获得进一步的答案或建议,了解下一步如何使用 OOP 以及我已经建立的这门课程。
它按原样工作,这对我来说是一个很好的起点,除了我将在接下来添加的任何错误处理,但我想确保我没有在这里犯任何明显的设计错误。
该类的代码如下:
class db {
var $pdo;
public function __construct() {
$this->pdo = new PDO('mysql:dbname=' . DB_NAME . ';host=' . DB_HOST . ';charset=utf8', DB_USER, DB_PASS);
$this->pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
public function prepared_execute( $query, $bind_values = null, $type = null ) {
$preparedStatement = $this->pdo->prepare( $query );
if( $bind_values ) {
$i = 1;
foreach( $bind_values as $bind_value ) {
$preparedStatement->bindValue($i, $bind_value);
$i++;
} }
$preparedStatement->execute();
if( $type == FETCH_ARRAY ) { return $preparedStatement->fetchAll(); }
elseif( $type == NUM_ROWS ) { return $preparedStatement->rowCount(); }
elseif( $type == INSERT ) { return $this->pdo->lastInsertId(); }
else{ return true; }
}