【问题标题】:PDO request returns only one result where there should be morePDO 请求只返回一个结果,而应该有更多
【发布时间】:2012-10-03 10:04:16
【问题描述】:

我已经创建了这个函数:

<?php

$pdo_db = new PDO( 'mysql:host=' . $db_host . ';dbname=' . $db_name, $db_user_name, $db_password );

function qlist_pdo( $fields, $tables, $where_fields='', $where_values='', $order='', $limit='' ) {

GLOBAL $pdo_db; // ignore this, it will be in class later. This is just for test purposes

if ( $order ) $order = ' ORDER BY ' . $order;
if ( $limit ) $limit = ' LIMIT ' . $limit; 

if ( is_array( $where_fields ) && is_array( $where_values ) && isset( $where_fields ) && isset( $where_values ) ) {

    if ( sizeof( $where_fields ) != sizeof( $where_values ) ) {
        die( "Query error: where <strong>field</strong> count doesn't match <strong>value</strong> count!" );
    } else {

        $where = ' WHERE ';
        foreach( $where_fields as $key => $value ) {
            $where .= $key . ' ' . $value . '=? ';
        }
        $where = substr( $where, 0, -1 );

        echo $query = "SELECT " . $fields . " FROM " . $tables . $where . $order . $limit;
        $qp = $pdo_db -> prepare( $query );

        foreach ( $where_values as $key => $val ) {
            $qp -> bindParam( $key+1, $val );
        }           

    }

} else {
    echo $query = "SELECT " . $fields . " FROM " . $tables . $order . $limit;
    $qp = $pdo_db -> prepare( $query );
}

$qp -> execute();
$result = $qp -> fetchAll();

return $result;

}

?>

我这样称呼它:

$result = qlist_pdo( "*", "list", array( '' => 'id', 'OR' => 'id' ), array( '2', '8' ), 'id DESC' );

当我设置 where 参数时,它工作正常,但结果只有 1 行(应该是 2 )。如果我在没有像这样的参数的情况下调用它:

$result = qlist_pdo( "*", "list", '', '', 'id DESC' );

它返回所有行。为什么会这样,我做错了什么?

查询生成:

SELECT * FROM list WHERE id=? OR id=? ORDER BY id DESC

生成的参数:

1, 2
2, 8  

[EDIT] 看起来它只添加了第二个参数。如果我将 OR 更改为 AND 它仍然会给出一个结果,即使它根本不应该给出任何行(因为不能有 ID = 2 AND ID = 8 选项)。

[EDIT2] 我设置了查询日志并得到了我的想法。实际查询为SELECT * FROM list WHERE id='8' OR id='8' ORDER BY id DESC

【问题讨论】:

  • 查看生成的 2 个查询会有所帮助

标签: php mysql pdo


【解决方案1】:

您将参数作为字符串传递,但它们是整数。

我建议以不同的方式传递数组:

$result = 
   qlist_pdo( "*", "list", 
   array( '' => 'id', 'OR' => 'id' ), array( 2, 8 ), 'id DESC' );

你的函数应该是这样的:

function qlist_pdo( $fields, $tables, $where_fields = '', $where_values = '', $order = '', $limit = '' )
{
  if ( $order )
    $order = ' ORDER BY ' . $order;
  if ( $limit )
    $limit = ' LIMIT ' . $limit;

  if ( is_array( $where_fields ) && is_array( $where_values ) && isset( $where_fields ) && isset( $where_values ) ) 
  {

    if ( sizeof( $where_fields ) != sizeof( $where_values ) ) {
      die( "Query error: where <strong>field</strong> count doesn't match <strong>value</strong> count!" );
    } 
    else {

      $where = ' WHERE ';
      $p = 0;
      foreach ( $where_fields as $key => $value ) {
        $where .= $key . ' ' . $value . '= :p' . $p . ' ';
        $p++;
      }
      $where = substr( $where, 0, -1 );

      echo $query = "SELECT " . $fields . " FROM " . $tables . $where . $order . $limit; // . '<br>';
      $qp = $pdo_db->prepare( $query );

      foreach ( $where_values as $key => $val ) {
        $qp -> bindParam( ":p$key", $val, PDO::PARAM_INT );
        //echo ":p$key" . '<br>';
      }

    }

  } 
  else {
    echo $query = "SELECT " . $fields . " FROM " . $tables . $order . $limit;
    $qp = $pdo_db->prepare( $query );
  }
}

当删除输出的 cmets 时,我得到了这个结果(对我来说似乎没问题)

SELECT * FROM list WHERE id= :p0 OR id= :p1 ORDER BY id DESC
:p0
:p1

【讨论】:

  • 按预期工作。我说的是所有 IF 都通过但带有参数 1 2 and 2 8 的查询 SELECT * FROM list WHERE id=? OR id=? ORDER BY id DESC 仅返回带有 ID=8 的结果的情况。
  • @DainisAbols 抱歉,我一定误读了您的问题。你能试试我调整后的答案吗?
  • 只有最后一个参数仍然是相同的结果。
  • 有些地方不太对劲:SELECT * FROM list WHERE id= :p 1OR id= :p ORDER BY id DESC 和错误Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens Array ( ) `
  • Ahhh .. 第 3 部分中错误位置的空格和缺少的 ; 已更新
【解决方案2】:

嗯,这很奇怪,但是绑定参数时似乎需要一个ref。

代替:

foreach ( $where_values as $key => $val ) {

我需要:

foreach ( $where_values as $key => &$val ) {

不知道为什么,但 & 是我唯一需要添加到代码中的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    • 2020-10-18
    • 2021-01-13
    • 2022-12-13
    • 2018-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多