【问题标题】:PDO FetchAll returns an empty array but there is value in dbPDO FetchAll 返回一个空数组,但 db 中有值
【发布时间】:2016-12-11 18:45:28
【问题描述】:

我有一个带有多项选择的下拉框。下拉列表如下所示:

 <select multiple class="form-control" name="batch_no[]"  id="batch_no" required onchange="getBatchCourseDetail();">
<option value="">-----------Select Your Batch----------</option>
<?php
foreach ($result as $res) 
{
  ?>
    <option value="<?php echo $res['batch_code']; ?>"><?php echo $res['batch_code']; ?></option>
<?php
 } ?>
</select>

在 onchange 函数调用中,我有这样的脚本:

function getBatchCourseDetail()
{
    var other = String($('#batch_no').val());
    var opts = [],
    opt;
    var split1 = other.split(',');
    for (var i = 0; i < split1.length; i++) 
    {
       opt = split1[i];
       opts.push(opt);
    }
    $.ajax({
      url: 'course_apply_batch_course_detail_ajax.php',
      type: 'POST',
      data: 
      {
        batch_code: opts
      },
      success: function (data) 
      {
        //console.log(data);
        $('#batch_information_autofill').html(data);
      }
   });
}

在 course_apply_course_detail_ajax.php 页面中的 ajax 文件中,我检索下拉列表的所有值。

course_apply_course_detail_ajax.php:

<?php
 require('classes/autoloader.php');
 $course_apply = new \Model\CourseApplyModel();
 $batch_code111=array();
 $batch_code111 = $_POST['batch_code'];
 $batch_code1 ="'" .implode("','",$batch_code111) ."'";

 $parameter = array(
    "batchcode" => $batch_code1,
    "status" => 0);

 $result11 =$course_apply->getBatchCourseDetail11($parameter);

 echo"<pre>";
 print_r($result11);
 echo"</pre>";
 exit;
 ?>

我将获得 $batch_code1 值:'LATS-CHMB-1000'、'LATS-SA-1000'、'LATS-ABSE-1003',它们存储在数组变量 'batchcode' 中。

在模型中我的查询如下所示:

 public function getBatchCourseDetail11($parameter)
{
 /* $QUERY1="SELECT start_date,end_date,course_code FROM batch WHERE
     batch_code IN('LATS-CHMB-1000','LATS-SA-1000','LATS-ABSE-1003') AND status =0"; */

  $query1="SELECT start_date,end_date,course_code FROM batch WHERE status =:status AND batch_code IN(:batchcode)";
  try{
        $result1=$this->dbh->prepare($query1);
        $result1->execute($parameter);
        $data11=$result1->fetchAll(\PDO::FETCH_ASSOC);
        return $data11;
    }
    catch(\PDOException $e)
    {
        print_r($e);
        return false;
    }

}

当我尝试打印返回数据时,我得到了 array() 但查询在 phpmyadmin 中正确执行。

提前谢谢请帮我解决这个问题。

【问题讨论】:

  • 你使用转义反斜杠做什么?
  • @Maksim.T 你的意思是这一行: $course_apply = new \Model\CourseApplyModel();它为类创建一个对象。
  • 不,我的意思是当您使用 PDO 形成数组并捕获异常时。 IE。捕获(\PDOException $e)
  • @Maksim.T 请参考此链接:stackoverflow.com/questions/13614484/…。要捕获异常,我们需要在类名后面加上反斜杠。
  • @Maksim.T 当我试图这样做时 print_r($this->$result1->errorInfo());死();执行后我遇到了一个致命错误。

标签: javascript php pdo


【解决方案1】:

查询是您的问题

$query1="SELECT start_date,end_date,course_code 
         FROM batch 
         WHERE status =:status 
           AND batch_code IN(:batchcode)";

不可能用占位符替换任意查询部分。因此,对于逗号分隔的占位符,如 IN(),您必须手动创建一组 ? 并将它们放入查询中:

简而言之,如果您的 IN() 列表中有 3 个您想要的值,我们必须创建类似 IN(?,?,?) 的语法,然后将 3 个参数传递给 prepare。

public function getBatchCourseDetail11($parameter)
{
    // generate the number of ? we need
    $ins  = str_repeat('?,', count($parameter['batchcode']) - 1) . '?';

    $query1="SELECT start_date,end_date,course_code 
             FROM batch 
             WHERE status = ?
               AND batch_code IN($ins)";
    try{
        $result1=$this->dbh->prepare($query1);

        $params[] = $parameter['status'];
        foreach ( $parameter['batchcode'] as $p ) {
            $params[] = $p;
        }

        $result1->execute($params);

        $data11=$result1->fetchAll(\PDO::FETCH_ASSOC);
        return $data11;
    }
    catch(\PDOException $e) {
        print_r($e);
        return false;
    }

}

【讨论】:

  • 我复制并使用了您提供的代码,但我得到的仍然是一个空数组。我可以向你保证,我在 db 中有值。我用 PHPmyadmin 检查了查询,我可以成功获取这些值。
  • 你确定你已经将 PDO 设置为异常模式吗,可能有一些语法错误我现在无法测试这个$conn-&gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION)
  • 您提供的代码是正确的,它没有显示错误但返回空。
  • 编辑后的代码不会显示错误,因为 $parameter['batchcode'] 中的值是一个字符串,如果我们想在 foreach 中使用它,我们必须先分解它,然后才能使用除此之外,这是不可能的。
  • 我还在想
猜你喜欢
  • 2013-04-21
  • 2014-02-02
  • 2014-05-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-20
  • 2014-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多