Если вы создаете такую сложную функцию, почему бы вам не проверить сначала возвращаемые значения?
Я сделал это испытание
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
и т.д ...
Вы должны ассоциативный массив, который передает имя столбца как 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"]);
Если вам нужно несколько имен столбцов и значения, просто добавьте больше ключ => значение пары.
$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 не разделяется между ними.
@YourCommonSense Мы не можем задавать информативные/канонические вопросы, мы не можем исправить коды, так что мы здесь делаем? –
@ Г-н Алиен, нисходящий? –
@MarcinOrlowski Я тоже этого не делаю :) также, код предоставляется, он пытался, итак, на каких основаниях мы должны голосовать? –