PDO / SQL从函数中选择*,显示无结果

时间:2014-01-02 09:45:51

标签: php mysql sql pdo

我正在使用这个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"]来显示我的结果。

可能是什么问题?

1 个答案:

答案 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)

那么,您是否希望列名称为01,而不是真正的列名?

我想 - 不。您需要在闭包中使用array_keys(),但是您将array $where作为数值数组传递(仅包含值),因此键为01等...... < / 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()此处接受值150red作为数组值(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对象。