我正在使用这个PHP函数:
if(!function_exists("SelectQuery2")) {
function SelectQuery2($table, array $where) {
//PDO
global $pdo_conn;
$sql = "SELECT * FROM `$table` ";
$values = null;
if ($where) {
$sql .= "WHERE " . implode(" AND ", array_map(function ($c) { return "`$c` = ?"; }, array_keys($where)));
$values = array_values($where);
}
$stmt = $pdo_conn->prepare($sql);
$stmt->execute($values);
}
}
我在这里称呼它:
$where = array(" ticketnumber = ".$_GET["seq"]." ");
$ticket=SelectQuery2("tickets", $where);
$ticket = $ticket[0];
但我没有得到任何结果。
我使用$ticket["column_name"]
来显示我的结果。
可能是什么问题?
答案 0 :(得分:4)
如果要创建这样一个复杂的函数,为什么不首先检查返回值?
我做了这个测试
function SelectQuery2($table, array $where) {
$sql = "SELECT * FROM `$table` ";
$values = null;
if ($where) {
$sql .= "WHERE " . implode(" AND ", array_map(function ($c) { return "`$c` = ?"; }, array_keys($where)));
$values = array_values($where);
}
return array($sql, $values);
}
$where = array("ticketnumber = asdasdasd", "ticketbla = dfgdfgdfg");
$ticket=SelectQuery2("tickets", $where);
var_dump($ticket);
输出是:
array (size=2)
0 => string 'SELECT * FROM `tickets` WHERE `0` = ? AND `1` = ?' (length=49)
1 =>
array (size=2)
0 => string 'ticketnumber = asdasdasd' (length=26)
1 => string 'ticketbla = dfgdfgdfg' (length=21)
那么,您是否希望列名称为0
和1
,而不是真正的列名?
我想 - 不。您需要在闭包中使用array_keys()
,但是您将array $where
作为数值数组传递(仅包含值),因此键为0
,1
等...... < / p>
您需要一个关联数组,它将列名称传递为key
,因为闭包需要这种方式,值为value
,因为PDOStatement::execute
需要这样,不使用命名占位符时,?
。
http://www.php.net/manual/en/pdostatement.execute.php 这里的恰当例子是:
<?php
/* Execute a prepared statement by passing an array of insert values */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < ? AND colour = ?');
$sth->execute(array($calories, $colour));
?>
其中表示execute()
此处接受值150
和red
作为数组值(array(150, 'red')
),在您的情况下(array($_GET["seq"])
)。
传递的数组的正确示例应为:
$where = array('ticketnumber' => $_GET["seq"]);
如果您需要多个列名和值,只需添加更多key =&gt;价值对。
$where = array(
'ticketnumber' => $_GET["seq"],
'ticket_owner' => $_GET['owner'],
'ticket_etc' => $_GET['etc']
);
但是,这里有一些缺点:
您的功能对于col1 = val1 AND col2 = val2 AND...
规则来说非常复杂。您的SELECT查询仅用于简单数据提取。你几乎不能使用SQL函数,HAVING子句,日期操作符,BETWEEN和<
; >
。强>
这就是为什么我不建议这种包装PDO的变体。就其本质而言,PDO已经是某种包装器。至少不要使查询字符串动态化。您可以尝试打包prepare()
,execute()
,fetch()
,但请停在那里。也不要在过程PHP函数中这样做。它只会增加糟糕设计的痛苦,例如使用全局变量,因为它们之间不共享PDO对象。