【问题标题】:SQL field being printed as a stringSQL 字段被打印为字符串
【发布时间】:2013-08-12 00:46:22
【问题描述】:

我有一个搜索表单来获取一些记录。表单的限制字段之一是 record,它是一个下拉框,如下所示:

<select name="record" id="record">
<option value="1">Highest Score</option>
<option value="2">Most runs</option>
</select>

然后当他们搜索以下代码时:

if (isset($_GET['action']) and $_GET['action'] == 'search')
{
  include $_SERVER['DOCUMENT_ROOT'] . '/stats/includes/db.inc.php';

  $placeholders = array();

  if($_GET['record'] == '1'){
      $placeholders[':record'] = 'runs';
  } else if($_GET['record'] == '2'){
      $placeholders[':record'] = 'SUM(runs)';
  }

  $select = 'SELECT playerid, :record as record, user.usertitle';
  $from   = ' FROM cricket_performance p INNER JOIN user ON p.playerid = user.userid';
  $where  = ' WHERE TRUE';

  if ($_GET['team'] != '')
  {
    $where .= " AND team = :team";
    $placeholders[':team'] = $_GET['team'];
  }

  if ($_GET['record'] != '')
  {
    $where .= " ORDER BY :record DESC";
  }

  $where .= " LIMIT 10";

  try
  {
    $sql = $select . $from . $where;
    $s = $pdo->prepare($sql);
    $s->execute($placeholders);
  }
  catch (PDOException $e)
  {
    $error = 'Error fetching record';
    include 'form.html.php';
    exit();
  }

    foreach ($s as $row)
    {
    $records[] = array('playerid' => $row['playerid'], 'record' => $row['record'], 'usertitle' => $row['usertitle'], '1' => $row['1']);
    }
    include 'form.html.php';
    exit();
}

除了一件事之外,这一切都很好。这:$placeholders[':record'] = 'runs'; 在 SQL 中实际上被打印为“runs”,而不是从数据库中选择的 runs 字段,所以 $record['record'] 将打印为每个条目的“runs”,而不是数字被从桌子上挑出来。

如果引号被替换为“”,同样的事情发生,如果被替换为``什么都没有发生(空结果)

【问题讨论】:

    标签: php sql string pdo


    【解决方案1】:

    PDO 期望绑定参数是例如WHERE 子句。因此

    $s = $pdo->prepare($sql);
    $s->execute($placeholders);
    

    不会按预期工作。 PDO 从

    创建
    SELECT playerid, :record as record, user.usertitle
    

    类似

    SELECT playerid, 'runs' as record, user.usertitle
    

    并尝试执行。

    【讨论】:

      【解决方案2】:

      您不应该在表格或字段名称中使用占位符。改用变量,无论如何都不需要对值进行清理。

      "SELECT playerid, ".$field." as record, user.usertitle"
      

      【讨论】:

        猜你喜欢
        • 2016-01-06
        • 1970-01-01
        • 1970-01-01
        • 2019-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-10
        相关资源
        最近更新 更多