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

时间:2015-04-13 18:46:04

标签: php forms

我正在编写一个泛型函数,它将从$ _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;
}

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

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

1 个答案:

答案 0 :(得分:1)

您的代码存在一些问题:

  • 请使用prepared statements(见下文)!

  • 错误消息(未完全显示)将继续使用&#34;未定义索引firstName&#34;,因为!过多(!isset($_POST['firstName'])) var_dump

  • 错误消息不完整,因为xdebug会缩短xdebug.overload_var_dump输出。您可以使用设置xdebug.var_display_max_data// 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'] : '' )); 更改此行为。请参阅xdebug documentation

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


{{1}}