使用PDO编写的语句MySQL错误

时间:2015-10-14 16:25:59

标签: php mysql pdo

我正在尝试在PHP中创建一个OOP样式的CRUD类,并使用PDO预处理语句来防止注入。我的连接工作正常,我可以从类中执行常规SQL查询,但是当我尝试合并PDO的prepare函数时,我得到一个错误,我要么有MySQL语法错误,要么PDO准备未定义。

错误在$p_query = $db->prepare($sql)行引发。谁能发现我做错了什么?

<?php
require_once 'dbconfig.php';

class Crud {
    protected $db;

    private static function fetchQuery($sql, $values) {
        echo $sql;
        var_dump($values);
        $db = Db_conn::pdoBuilder();
        $p_query = $db->prepare($sql);
        $p_query->execute($values);
        $results = $p_query->fetch(PDO::FETCH_OBJ);
        return $results;    
    }
    public static function show($tbl, $id) {
        $sql = '"SELECT * FROM (:tbl) WHERE id = (:id)"';
        $values = [':tbl' => $tbl, ':id' => $id];
        $results = self::fetchQuery($sql, $values);
        return $results;

    }

    public static function listAll($tbl) {
        $sql = '"SELECT * FROM (:tbl)"';
        $values = [':tbl' => $tbl];
        $results = self::fetchQuery($sql, $values);
        return $results;
    }
}

1 个答案:

答案 0 :(得分:1)

首先关闭:

Census  RN Staffing Needs       
        7a  3p  11p     
1       2   2   2       
2       2   2   2       
3       2   2   2       
4       3   3   2       
5       4   4   3       
6       4.5 5   5       
7       5   6   6       
8       6   7   6.5     
9       7   8   7       
10      8.5 9   8.5     
11      10  11  10      
12      12  12  11.5    
13      12  12  12      
14      12  12  12      
15      13  13  13      
16      13  13  13      
17      14  14  14      
18      14  14  14      

为什么要引用您的查询?它应该是:

$sql = '"SELECT * FROM ?"';

下一步:

$sql = 'SELECT * FROM ?';

查询中的占位符$values = [':tbl' => $tbl]; 在哪里?您正在使用:tbl,请将?字符串更改为:

$sql

这会立即引发另一个问题:您在准备好的语句中使用的表在创建预准备语句后无法绑定。 Impossiburu。永远不会发生。你能做的最好就是:

$sql = 'SELECT * FROM :tbl';

最后,应用于此位:

$sql = sprintf(
    'SELECT * FROM `%s`',
    //remove illegal chars
    str_replace([' ', '\\', '`', '"', "'"], '', trim($tbl))
);

这意味着你必须写:

$sql = '"SELECT * FROM (:tbl) WHERE id = (:id)"';
$values = [':tbl' => $tbl, ':id' => $id];
$results = self::fetchQuery($sql, $values);

但实际上,你并没有使用准备好的陈述,也许你可以。准备好的陈述最好的事情是它们可以重复使用。据我所知,包装$sql = sprintf( 'SELECT * FROM `%s` WHERE id = :id', $tbl ); $values = [':id' => $id]; return self::fetchQuery($sql, $values); 以获得更清洁的API还没有完成。大多数尝试实际上都会降低扩展的功能,或者在它周围构建一个膨胀的抽象层。如果你正在构建一个完整的ORM / DBAL,那就不是件坏事。 I've been quite vocal about this stuff here,您可能想要通读它