2014-01-02 3 views
1

Я использую эту PHP функцию:PDO/SQL Select * из функции не показывает никаких результатов

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"], чтобы показать результаты.

В чем может быть проблема?

+4

@YourCommonSense Мы не можем задавать информативные/канонические вопросы, мы не можем исправить коды, так что мы здесь делаем? –

+0

@ Г-н Алиен, нисходящий? –

+1

@MarcinOrlowski Я тоже этого не делаю :) также, код предоставляется, он пытался, итак, на каких основаниях мы должны голосовать? –

ответ

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 и т.д ...

Вы должны ассоциативный массив, который передает имя столбца как 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 не разделяется между ними.

+0

И кто сделал downvote, может быть, хочет объяснить? :) –

+0

когда я делаю var_dump на $ ticket, он показывает NULL –

+0

@charliejsford yes, он показывает null, потому что вы передаете значения PDO. Моя тестовая функция пропустила ваши строки выполнения и вернула значения, которые вы используете для драйвера pdo. Вы используете 'prepare ($ sql)' и 'execute ($ values)', поэтому я вернул значения и сбросил функцию. –

Смежные вопросы