【问题标题】:PHP alternative to loop inside a HEREDOCPHP替代在HEREDOC内循环
【发布时间】:2012-06-12 17:36:11
【问题描述】:

我正在尝试在 php 中的 HEREDOC 内创建循环。我知道这样做是不可能的,但这是我告诉我需要帮助的最佳方式.. 这是我的代码:

<?
$sth = $dbh->prepare("SELECT field1, field2 FROM table WHERE id = '".$_GET['id']."'");
$sth->execute();
echo <<<HERE_DOC
    [
    while($row = $sth->fetch()){ 
        echo '{"optionValue":"'.$row['field1'].'", "optionDisplay": "'.$row['field2'].'"},'; 
    }
    ]
HERE_DOC;
?>

它告诉我这个

 Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in /public_html/test.php on line 7

我认为它会返回这个,因为不可能在 HEREDOC 内创建循环 - 但否则我该怎么做......?

该脚本由 AJAX 驱动,带有此脚本:

<script type="text/javascript">
$(function(){
  $("select#state").change(function(){
    $.getJSON("test.php",{id: $(this).val(), ajax: 'true'}, function(j){
      var options = '';
      for (var i = 0; i < j.length; i++) {
        options += '<option value="' + j[i].optionValue + '">' + j[i].optionDisplay + '</option>';
      }
      $("select#city").html(options);
    })
  })
})
</script>

而原来的test.php是这样的:

if ($_GET['id'] == "1234") {
  echo <<<HERE_DOC
    [
    {"optionValue":"000", "optionDisplay": "a"},
    {"optionValue":"300", "optionDisplay": "s"},
    {"optionValue":"600", "optionDisplay": "d"},
    {"optionValue":"700", "optionDisplay": "cr"},
    {"optionValue":"500", "optionDisplay": "Gı"},
    {"optionValue":"400", "optionDisplay": "K"},
    {"optionValue":"800", "optionDisplay": "S"},
    {"optionValue":"900", "optionDisplay": "ik"},
    {"optionValue":"350", "optionDisplay": "Tu"}
    ]
HERE_DOC;
else if ($_GET['id'] == "2345") { etc......

问题是我已经拥有 SQL 数据库中的所有数据,我只想根据之前选择列表中的 id 返回数据,因为有很多选项。

【问题讨论】:

  • 为什么需要在 HEREDOC 中执行此操作?你不能只连接字符串吗?
  • 哦,看。一个包含一些 SQL 的 PHP 问题。 Hello, Bobby.
  • ... 你是通过将字符串组合在一起来生成 JSON 吗?使用json_encode!
  • 它来自另一个教程:remysharp.com/2007/01/20/… 我只想让它使用我的数据库,而不是我不得不重新编写所有内容。

标签: php sql ajax pdo heredoc


【解决方案1】:

不要自己制作 JSON,使用json_encode

<?
$json = array();
$sth = $dbh->prepare("SELECT field1, field2 FROM table WHERE id = '".$_GET['id']."'");
$sth->execute();
while($row = $sth->fetch(PDO::FETCH_ASSOC)){ // added PDO::FETCH_ASSOC
    $json[] = array(
        'optionValue' => $row['field1'],
        'optionDisplay' => $row['field2']
    );
}
echo json_encode($json);
?>

附:不要像那样直接使用$_GET。您很容易受到 SQL 注入的攻击。您已经在使用 PDO,请正确使用它。你应该这样做:

$sth = $dbh->prepare("SELECT field1, field2 FROM table WHERE id = ?");
$sth->execute(array($_GET['id']));

【讨论】:

  • 是的,除非您可能应该在循环内添加到数组中,而不是每次都替换它...
  • @PhilipJensBramsted:检查浏览器的开发工具,或在 $.getJSON 中添加 console.log(j) 以确保正确获取 JSON。
  • 它似乎没有返回数据。那么我应该如何处理jQuery脚本?
  • @PhilipJensBramsted:尝试将while($row = $sth-&gt;fetch()){ 更改为while($row = $sth-&gt;fetch(PDO::FETCH_ASSOC)){
  • 它可以工作.. 我为我愚蠢的 cmets 感到非常抱歉 - 我唯一错过的是我没有连接到数据库(DOH!)-.-'
猜你喜欢
  • 2016-12-11
  • 2013-02-17
  • 2023-01-13
  • 2013-04-05
  • 1970-01-01
  • 1970-01-01
  • 2013-07-09
  • 2017-09-03
  • 1970-01-01
相关资源
最近更新 更多