【问题标题】:PHP odbc_prepare WHERE field IN ($LIST) - (Progress OpenEdge 10.2A)PHP odbc_prepare WHERE field IN ($LIST) - (Progress OpenEdge 10.2A)
【发布时间】:2012-09-25 21:11:21
【问题描述】:

我正在尝试使用 odbc_prepare 和 odbc_execute 语句编写查询,如下所示:

$query = 'SELECT * FROM TABLE WHERE names IN (?) AND age < ?';
$names = "Joe, John, Billy";
$age = 21;
$result = odbc_prepare($this->connection, $query);
odbc_execute($query, array($names, $age));

当然,由于某种原因,这不起作用,我已经尝试了我的 $names 变量格式的几种变体。任何帮助将不胜感激,因为我无法找到任何使用 odbc_prepare 和 WHERE IN 子句的查询示例。

我正在使用 OpenEdge 10.2A odbc 驱动程序连接到 Progress 数据库。

【问题讨论】:

    标签: php sql odbc openedge


    【解决方案1】:

    您似乎正试图以一种奇怪的方式使用array()

    尝试做类似的事情:

    $names = array("Joe", "John", "Billy");
    foreach($names as $name)
    {   
        $query = 'SELECT * FROM TABLE WHERE names IN (?)'
        $result = odbc_prepare($this->connection, $name);
        odbc_execute($query, $name);
    }
    

    这里还有更多关于odbc_prepare()的信息

    【讨论】:

    • 如果我按照您的建议将其分开,则表明我将 3 个变量传递给它,而不是只传递一个。我已经阅读了文档,我的理解是您需要一次将所有变量传递到一个数组中,所以如果您的查询具有 WHERE names = ?和年龄
    • 那么您想分别执行该语句三次吗?
    • 也许更好的例子是这样的:SELECT * FROM TABLE WHERE names IN (?) AND age &lt; ?
    • 使用循环来分隔我的值并单独查询每个值是糟糕的设计,如果我有 100 个名称我想挑选出这意味着我需要运行 100 个查询。绝对不是我想做的。
    • 您需要澄清更多您正在寻找的内容。您是否希望您的查询最终像 SELECT * FROM table WHERE names IN ('bob', 'greg', 'sam') --- 或者您正在寻找 --- SELECT * FROM table WHERE names IN (' bob'), SELECT * FROM table WHERE names IN ('greg')?
    【解决方案2】:

    阅读手册我认为它应该是这样的:

    $query = 'SELECT * FROM TABLE WHERE names IN (?)'
    $names = array("Joe", "John", "Billy");
    $result = odbc_prepare($this->connection, $query);
    odbc_execute($query, array(implode(',', $names));
    

    这给出了一个包含 1 个元素的数组,因为请求了 1 个参数。 该元素包含一个字符串'Joe, John, Billy',这是IN 子句的正确值。

    【讨论】:

    • 我知道你不能爆炸数组。
    • 仍然没有骰子。我什至已经设置了 $names = "'Joe', 'John', 'Billy'";并且它没有工作,几乎就像绑定不支持 IN 子句或其他东西一样。
    • 我从mysql知道它不支持参数到函数中。 IN 是一个函数吗?
    • 此答案不适用于 Progress OpenEdge。请阅读有问题的最后一句话,它定义了环境。此答案包含与 MySQL 而不是 Progress 相关的逻辑。
    【解决方案3】:

    只是为了让以后的每个人都知道我为这个特殊问题想出了什么:

    $names = array("Joe","John","Billy");
    
    $queryVars = array();
    foreach($names AS $name){
        $queryVars[] = $name;
    }
    
    $paramBind = implode(',', array_fill(0, count($names), '?'));
    $query = 'SELECT * FROM TABLE WHERE names IN ('.$paramBind.')';
    
    odbc_execute($query, $queryVars);
    

    希望其他人觉得这很有用

    【讨论】:

    • 将文本连接到查询中会使代码容易发生 sql 注入
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    • 2010-11-16
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    相关资源
    最近更新 更多