我正在尝试在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;
}
}
答案 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,您可能想要通读它