使用 isset() 动态转换未定义的索引



我正在编写一个通用函数,它将从 $_POST 中获取大量字段并将 SQL 插入构建到表中。在这种情况下,我有许多未定义的索引,并且通过阅读有关SO的其他帖子,我正在使用三元来测试变量是否存在。当我在交互式 php 中使用它时,这非常有效,特别是因为没有定义 $_POST 变量。

但是当我在我的表格中使用它时,我似乎得到了一个额外的报价和一些回报,但我看不到它们来自哪里。我以不同的方式击败了这一点,但我希望有人能帮助我看到我没有看到的东西。

function SaveDonation($form) {
    try {
        $querystr = "INSERT INTO GeneralDonations(donationForm, firstName, startYear)" 
        . "VALUES(" . "'" . $form . "', "
        . ((!isset($_POST['firstName'])) 
            ? "'', " : ("'" . mysql_real_escape_string($_POST['firstName'])."', "))
        . ((isset($_POST['startDate'])) 
            ? ("'" . mysql_real_escape_string($_POST['startDate'])."' ") : "'' ") 
        .")";
        echo "<pre>query = "; var_dump($querystr);die;

        $donation = $this->db->insertRow($querystr);
        $result = true;
    } catch(MysqlException $e) {
        $result = false;
        $this->errorMsg = $e->getMessage();
    }
    return $result;
}

开始日期是未定义的索引值。这是使用 var_dump 的浏览器输出。似乎显示的是 x-debug 输出而不是变量。但是所有的表格,没有有用的数据?请帮我看看这里有什么不同?

string 'INSERT INTO GeneralDonations(
  donationForm, firstName, startYear)VALUES('buy-a-foot', 's', 
  '<br />rn<font size='1'><table class='xdebug-error xe-notice'
  dir='ltr' border='1' cellspacing='0' cellpadding='1'>rn
  <tr><th align='left' bgcolor='#f57900' colspan=' )' (length=284)

您的代码存在一些问题:

  • 请使用准备好的声明(见下文)!

  • 错误消息(未完全显示)将继续显示"未定义的索引firstName",因为(!isset($_POST['firstName']))中有太多!

  • 错误消息不完整,因为 xdebug 缩短了var_dump输出。您可以使用设置更改此行为 xdebug.overload_var_dumpxdebug.var_display_max_data 。请参阅 xdebug 文档。

  • 如果不能使用预准备语句,请考虑使用一些 sprintf() 构造来提高可读性。


// Prepared statements (untested)
$stmt = $db->prepare("
    INSERT INTO GeneralDonations(donationForm, firstName, startYear)
    VALUES (?, ?, ?)");
$stmt->execute(array(
    $form,
    isset($_POST['firstName']) ? $_POST['firstName'] : '',
    isset($_POST['startDate']) ? $_POST['startDate'] : ''
));

最新更新