【问题标题】:SQL query result to stringSQL查询结果转字符串
【发布时间】:2014-05-28 08:40:29
【问题描述】:

我在Yii framework 中使用SQL。 我需要显示此人最近的活动周(数字和日期)。所以我编写了以下代码:

public function latestWeek() 
{           
    $datalogin=//the login is working fine
    $sql ="SELECT w.number,MAX(w.start_date)
    FROM tbl_person_week t, tbl_week w
    WHERE t.person_id=$this->id AND t.week_id=w.id"; 

    $query = mysqli_query($datalogin, $sql);
    return $query;
}

现在,我在服务器上检查了这个查询,它工作正常(几乎)但第一件事:我需要将它转换为字符串,因为 yii 的 CgridView 无法读取它,我找不到一个有效的解决方案这个。

第二:在服务器上,它确实给了我最大日期,但不是正确的数字,而是第一个可用的数字。我该如何解决这个问题?

【问题讨论】:

  • 您需要JSON格式的查询字符串吗?或者你只是想要它作为纯字符串?

标签: php sql yii


【解决方案1】:

这样的查询永远不应该在目标框架中使用。如果你想执行你自己的查询,你应该这样做:

$sql = "your sql code";
$array = Yii::app()->db->createCommand($sql)->queryAll();

因此,您将获得包含选定列和行的多维数组

如果你想在网格视图中使用它,你应该这样做:

$count = Yii::app()->db->createCommand($sql)->queryScalar();

$dataProvider = new CSqlDataProvider($sql, array('totalItemCount'=>$count));

$this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'grid-id',
     'dataProvider'=> $dataProvider,
));

你也可以使用 Yii::app()->db 以外的连接。检查文档中的CDbConnection 类。

编辑:如果您想使用 mysql_fetch_assoc 之类的查询,请查看 queryRow() 方法而不是 queryAll()

【讨论】:

【解决方案2】:

使用 Mysql_fetch _array

public function latestWeek() 
    {           
        $datalogin=//the login is working fine
        $sql ="SELECT w.number,MAX(w.start_date)
        FROM tbl_person_week t, tbl_week w
        WHERE t.person_id=$this->id AND t.week_id=w.id"; 

        $query = mysqli_query($datalogin, $sql);
        while($row = mysqli_fetch_array($query)){
        echo $row;
        }

    }

【讨论】:

  • 我需要将它返回到视图而不是 echo ,它返回一个数组而不是字符串。
【解决方案3】:

假设从你的曲。如果您希望将周数和开始日期作为一个字符串,则必须将 sql 中的两列连接起来。

您还需要指定周数来自具有最长开始日期的行,这并不像您最初想象的那么简单。

我不喜欢将 person_id 直接注入 SQL,在这种情况下这并不可怕,但在安全方面是一个坏习惯。框架中有可用的绑定方法,我同意 Arek 的观点,你应该尽可能地依赖 yii 框架。

要获取标量字符串值,如果你坚持使用自己的SQL..我建议如下:

$sql='
  SELECT CONCAT('Week ',tw.number,' starting ',tw.start_date)
    FROM tbl_week tw
    JOIN (
      SELECT MAX(twi.start_date) max_start_date
        FROM tbl_week twi
        JOIN tbl_person_week tpwi
          ON tpwi.week_id = twi.id
         AND tpwi.person_id = :person_id
         ) i
      ON tw.start_date = i.max_start_date;
';
$command=Yii::app()->db->createCommand($sql);
$command->bindParam(":person_id", $this->id);
return $command->queryScalar();   

【讨论】:

  • 我明白了。看起来比我最初想的要复杂。我尝试使用您的代码,但我得到了白屏死机:)
  • 不,完全空白。
  • 数据库配置可能有问题。您的网络服务器上应该有一个application.log 文件,其中也有一个新错误。如果不访问堆栈跟踪,开发和调试将非常困难。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-23
  • 2015-11-05
相关资源
最近更新 更多