php - 传递带有多个 PHP 变量的 SQL WHERE 子句

标签 php mysql datetime pdo functional-programming

我有一个 AJAX 函数,它调用 fetchPosts() (PHP) 每 x 时间轮询数据库中的新内容。

该函数按预期工作,无需传递任何参数(在这种情况下,它返回数据库中的所有行,如下所示),但当我传递用于 MySQL WHERE 子句的变量时,它将不起作用.

function fetchPosts($cond = NULL, $oper = NULL, $val = NULL) {
    global $PDOhost, $PDOusn, $PDOpwd, $PDOdb;
    $pdo = new PDO("mysql:host=$PDOhost;dbname=$PDOdb", $PDOusn, $PDOpwd);

    if (isset($cond, $oper, $val)) {
        $stmt = $pdo->prepare("SELECT * FROM messages WHERE hidden=FALSE AND :cond :oper :val ORDER BY id DESC");
        $stmt->execute(array(
            ':cond' => $cond,
            ':oper' => $oper,
            ':val' => $val
            ));
    } else {
        $stmt = $pdo->prepare("SELECT * FROM messages WHERE hidden=FALSE ORDER BY id DESC");
        $stmt->execute();
    }
    ...
}

我正在从另一个函数调用该函数。

function debugOnlyShowNew() {
    $lastuseractivity= $_SESSION['lastuseractivity'];
    fetchPosts('timestamp', '>', $lastuseractivity);
}

_SESSION['lastuseractivity']被(重新)定义为 date ("Y-m-d H:i:s")几个事件并从两个函数正确回显。所有时区都是正确的(PHP 和 MySQL)。

session_start位于 function.php 的正上方,其中 debugOnlyShowNew()fetchPosts()已定义。

timestampDATETIME MySQL专栏

以下查询工作正常并按预期返回新内容:

SELECT * FROM messages WHERE hidden=FALSE AND timestamp > '2014-01-28 15:24:00' ORDER BY id DESC

什么给出了?

最佳答案

您不能直接执行此操作,因为 PDO 不允许您绑定(bind)运算符或列等内容。您必须通过将字符串连接在一起来构建 SQL。如果您这样做,请务必将条件和运算符列入白名单。我建议您尝试使用某些东西以编程方式与数据库交互,例如 RedBean:http://www.redbeanphp.com/

尽管如此,这里有一个可以工作并且仍然安全的示例(尽管不太易于维护):

function fetchPosts($cond = NULL, $oper = NULL, $val = NULL) {
    global $PDOhost, $PDOusn, $PDOpwd, $PDOdb;
    $pdo = new PDO("mysql:host=$PDOhost;dbname=$PDOdb", $PDOusn, $PDOpwd);
    // whitelist allowed operators
    $validOperators = Array('<','=','>','<>');
    if (!$oper || !in_array($oper, $validOperators) {
         $oper = null;
    }
    // whitelist allowed columns, conditions, etc.
    $validConditions = Array('col1','col2','col3');
    if (!$cond || !in_array($cond, $validConditions) {
         $cond = null;
    }
    $sql = 'SELECT * FROM messages WHERE hidden=FALSE';
    if (isset($cond, $oper, $val)) {
        $sql .= ' AND '.$cond.' '.$oper.' :val'; 
        $params = Array(':val' => $val);
    } else {
        $params = null;
    }
    $sql .= ' ORDER BY id DESC';
    $stmt = $pdo->prepare($sql);
    $stmt->execute($params);
    // do more stuff with results here...
}

关于php - 传递带有多个 PHP 变量的 SQL WHERE 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21408735/

相关文章:

PHP PDO SQL 语法错误

php - Prestashop 1.6 结账时金额篡改

mysql - Spring Bean更新和模型更新(Spring/Hibernate/Roo/MySQL)

mysql - 如何设计一个用户 "likes"另一个?

python - 将 DataFrame 序列化到 HDF5 存储时出现日期时间列错误

PHP和MySQL ACID程序设计

php - 将时间值与数据库进行比较以停止重复条目

php - 每次单击图像 (<a>) 时,在 mysql 表中更新分数 (+1)。使用 PHP

javascript - 我可以检查事件是否在一小时内发生,无论日期如何? Moment.js

sqlite - 如何将 SQLite 中的当前时间戳存储为滴答?