我遇到的问题是:当我尝试准备由DESCRIBE table_name
或组成的查询时,出现SHOW COLUMNS FROM table_name
一条错误,指出以下内容:
致命错误:消息“ SQLSTATE [42000]”未捕获的异常“ PDOException”:语法错误或访问冲突:1064 SQL语法有错误;在/Applications/MAMP/htdocs/test.php:28堆栈跟踪:#0 / Applications / MAMP / htdocs中,检查与您的MySQL服务器版本相对应的手册,以找到在“用户”附近的“用户”附近使用的正确语法:28 /test.php(28):PDOStatement-> execute()#1 /Applications/MAMP/htdocs/test.php(6):show_columns_yes_prepared('users')#2 {main}放在/ Applications / MAMP / htdocs /中第28行的test.php
该函数show_columns_not_prepared()
按预期/希望的方式返回以下内容:
Array
(
[0] => uid
[1] => name
[2] => pass
[3] => mail
[4] => mode
[5] => sort
[6] => threshold
[7] => theme
[8] => signature
[9] => signature_format
[10] => created
[11] => access
[12] => login
[13] => status
[14] => timezone
[15] => language
[16] => picture
[17] => init
[18] => data
[19] => timezone_name
[20] => timezone_id
)
...而上述错误是由于该功能而发生的show_columns_yes_prepared()
。两者都可以与test.php
位于我的本地主机根目录中的文件中使用的其余源代码(verbatim)一起找到。
准备DESCRIBE
SQL查询是不可能完成的任务吗?还是我做错了什么?都不行 都?
数据库/表创建:
CREATE DATABASE `testdatabaseforpdo` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
USE `testdatabaseforpdo`;
CREATE TABLE `users` (
`uid` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(60) NOT NULL DEFAULT '',
`pass` varchar(32) NOT NULL DEFAULT '',
`mail` varchar(64) DEFAULT '',
`mode` tinyint(4) NOT NULL DEFAULT '0',
`sort` tinyint(4) DEFAULT '0',
`threshold` tinyint(4) DEFAULT '0',
`theme` varchar(255) NOT NULL DEFAULT '',
`signature` varchar(255) NOT NULL DEFAULT '',
`signature_format` smallint(6) NOT NULL DEFAULT '0',
`created` int(11) NOT NULL DEFAULT '0',
`access` int(11) NOT NULL DEFAULT '0',
`login` int(11) NOT NULL DEFAULT '0',
`status` tinyint(4) NOT NULL DEFAULT '0',
`timezone` varchar(8) DEFAULT NULL,
`language` varchar(12) NOT NULL DEFAULT '',
`picture` varchar(255) NOT NULL DEFAULT '',
`init` varchar(64) DEFAULT '',
`data` longtext,
`timezone_name` varchar(50) NOT NULL DEFAULT '',
`timezone_id` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`uid`),
UNIQUE KEY `name` (`name`),
KEY `access` (`access`),
KEY `created` (`created`),
KEY `mail` (`mail`),
KEY `picture` (`picture`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
源代码(getConnection()
根据需要在内部调整连接信息):
<?php
$table = 'users';
print_r(show_columns_not_prepared($table));
print_r(show_columns_yes_prepared($table));
function show_columns_not_prepared($table) {
$db = getConnection();
// Not prepared, not safe...
$sql = "DESCRIBE $table";
$stmt = $db->query($sql);
$out = array();
while ($res = $stmt->fetchAll(PDO::FETCH_ASSOC)) {
for ($i = 0; $i < count($res); $i++) {
$out[] = $res[$i]['Field'];
}
}
return $out;
}
function show_columns_yes_prepared($table) {
$db = getConnection();
// Ready to be prepared...
$sql = "DESCRIBE :table";
$stmt = $db->prepare($sql);
$stmt->bindValue(':table', $table, PDO::PARAM_STR);
$stmt->execute();
$out = array();
while($res = $stmt->fetch(PDO::FETCH_ASSOC)) {
for ($i = 0; $i < count($res); $i++) {
$out[] = $res[$i]['Field'];
}
}
return $out;
}
function getConnection() {
$dbhost="localhost";
$dbuser="someuser";
$dbpass="somepass";
$dbname="testdatabaseforpdo";
$dbh = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->exec("set names utf8");
return $dbh;
}
使用safeMysql就像一只鸡:
function show_columns_yes_prepared($table)
{
$db = getConnection(); // I HOPE it's SINGLETON. Yikes, it is not
return $db->getCol( "DESCRIBE ?n", $table);
}
使用丑陋的PDO可能是一个问题,因此,您最好坚持information_schema
按照Jack的建议进行查询:
function show_columns_yes_prepared($pdo, $table)
{
$sql = "SELECT column_name FROM information_schema.columns WHERE table_name =?";
$stm = $pdo->prepare($sql);
$stm->execute([$table]);
return $stm->fetchAll(PDO::FETCH_COLUMN);
}
但是该getConnection();
功能实际上会在或多或少的生产环境中杀死您的数据库服务器。
因为您应该只为每个应用程序连接一次ONCE,并在整个脚本中使用该单一连接,而不是每次需要查询数据库时都进行连接。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句