用于从变量MySQL表获取数据的PHP PDO函数
我正在尝试制作一个可以在多个页面上使用的函数,以节省使用的代码量。其中一个函数参数应该告诉函数从哪个mysql表获取所有数据,但由于某些原因,该函数无法工作。以下是我所拥有的:用于从变量MySQL表获取数据的PHP PDO函数,php,mysql,database,pdo,crud,Php,Mysql,Database,Pdo,Crud,我正在尝试制作一个可以在多个页面上使用的函数,以节省使用的代码量。其中一个函数参数应该告诉函数从哪个mysql表获取所有数据,但由于某些原因,该函数无法工作。以下是我所拥有的: function get_data($conn, $type) { $stmt = $conn->prepare("SELECT * FROM :type"); $stmt->bindParam(':type', $type); $stmt->execute(); $re
function get_data($conn, $type) {
$stmt = $conn->prepare("SELECT * FROM :type");
$stmt->bindParam(':type', $type);
$stmt->execute();
$results = $stmt->fetchAll();
return $results ? $results : false;
}
因此,当我调用某个页面上的函数时,我使用:
$conn = connect();
$results = get_data($conn, 'links');
为什么这个函数不起作用?有人知道吗?据我所知,不能将表作为参数传递。因此,必须使用字符串连接构建查询。在这种情况下,SQL注入的风险应该为零,因为您不应该接受来自外部源的表名 示例
function get_data($conn, $table_name) {
// The backticks are used in case table name contains spaces, or it matches a keyword
$stmt = $conn->prepare('SELECT * FROM `' . $table_name . '`');
$stmt->bindParam(':type', $type);
$stmt->execute();
$results = $stmt->fetchAll();
return $results ? $results : false;
}
另一个注意事项虽然我可以理解您想要实现的目标,但是这种访问数据的方法效率很低。首先,您可以使用星号,在运行查询时,星号通常是一个很大的“不”。其次,使用这种方法,您不能添加诸如WHERE、JOIN等子句。始终不分青红皂白地从表中提取所有数据可能会导致严重的性能问题。@Diego是正确的,您不能将SQL参数用于表名、列名、SQL关键字、值列表(如in()谓词)或任何其他表达式
SELECT :column FROM table -- NO, unless you want to select a constant string
SELECT * FROM :table -- NO
SELECT * FROM table WHERE column IN (:list) -- NO
SELECT * FROM table ORDER BY :column -- NO
SELECT * FROM TABLE ORDER BY column :asc_or_desc -- NO
基本上,请记住这条规则:如果您可以将一个常量值(例如带引号的字符串、日期或整数)替换为SQL参数,那么这就是参数的合法使用。否则,不会
SELECT :string FROM table -- OK, but returns value of :string for every row
SELECT * FROM table WHERE column = :string -- OK
SELECT * FROM table WHERE column IN (:x, :y, :z) -- OK, one parameter per value
此外,在编程PDO时,应始终检查prepare()
和execute()
的返回值。如果出现错误,它们将返回false
,您应该编写代码来检测并做出适当的响应(即记录错误、显示错误页面、给用户另一次机会等)
您甚至可能希望检查其他PDO函数的返回值。请参阅文档,其中许多函数在出现错误时返回
false
。抱歉,为什么函数不起作用。
$stmt = $conn->prepare("SELECT * FROM :type"); // illegal use of parameter
if ($stmt === false) {
// check $pdo->errorInfo(), see documentation
}
$stmt->bindParam(':type', $type);
$status = $stmt->execute();
if ($status === false) {
// check $stmt->errorInfo(), see documentation
}