【问题标题】:make php code shorter with conditional statements?使用条件语句使 php 代码更短?
【发布时间】:2020-04-17 03:36:26
【问题描述】:

几年前我上了一门 PHP 课程,但大部分知识已经褪色。所以我有一个问题。 在 Joomla 表单(RSJoomla 的 RSForms)中,我使用了这样的重复代码:

$locatie01 = $_POST['form']['locatie_01'];
$locatie02 = $_POST['form']['locatie_02'];
$locatie03 = $_POST['form']['locatie_03'];
$locatie04 = $_POST['form']['locatie_04'];
$locatie05 = $_POST['form']['locatie_05'];
$locatie06 = $_POST['form']['locatie_06'];

这样一直持续到达到 100。(位置(在荷兰语中拼写为“locatie”)被发布到数据库中。 再往下一点,我们正在做类似的事情,但代码更复杂,所以我只列出 3:

 $db->setQuery("
     INSERT INTO #__instellingen
     (type,instelling,locatie,contactpersoon,telefoon,email,ivvu,vgu,token)
     VALUES
     ('".$type."','".$instelling."','".$locatie01."','".$contactpersoon."','".$telefoon."','".$email."','".$ivvu."','".$vgu."','".$token."')
 ");
 $db->query();

 if(!empty($locatie02)){
 $db->setQuery("
     INSERT INTO #__instellingen
     (type,instelling,locatie,contactpersoon,telefoon,email,ivvu,vgu,token)
     VALUES
     ('".$type."','".$instelling."','".$locatie02."','".$contactpersoon."','".$telefoon."','".$email."','".$ivvu."','".$vgu."','".$token."')
 ");
 $db->query();
 }

 if(!empty($locatie03)){
 $db->setQuery("
     INSERT INTO #__instellingen
     (type,instelling,locatie,contactpersoon,telefoon,email,ivvu,vgu,token)
     VALUES
     ('".$type."','".$instelling."','".$locatie03."','".$contactpersoon."','".$telefoon."','".$email."','".$ivvu."','".$vgu."','".$token."')
 ");
 $db->query();
 }

这也持续到 100

我们在这里做的是:第一行总是填充(必填字段),然后:如果2不为空,则将数据发送到数据库,3等。

现在我可以看出这不是最短的编码方式,而且我隐约记得我们能够编写更短的代码;是用代码编码吗?如果 .... a++。对不起,我不记得了.... 谁能刷新我的记忆?

谢谢,

汤姆

【问题讨论】:

  • 循环和函数...
  • 听起来很熟悉,拉斯。能详细解释一下吗?
  • 每当你发现自己给事物命名 $foo_1, $foo_2, etc 时,这意味着你应该使用数组来代替。

标签: php conditional-statements shorthand


【解决方案1】:

您的代码不完整,我不知道 $token 变量来自哪里,所以我假设它来自表单。 另外,我猜您正在使用PDO 对象的数据库,但mysqli 驱动程序几乎相同。

你可以这样做:

foreach($_POST['form'] as $key) {
    $sql = 'INSERT INTO #__instellingen (type, instelling, locatie, 
    contactpersoon, telefoon, email, ivvu, vgu, token) VALUES (?,?,?,?,?,?,?,?,?)';
    $stmt = $pdo->prepare($sql);
    $stmt->execute([$key['type'], $key['instelling'], $key['locatie'], $key['contactpersoon'], $key['telefoon'], 
    $key['email'], $key['ivvu'], $key['vgu'], $key['token']);
}

“?”均值绑定参数。 为了在代码中添加一个避免 SQL 注入的层,使用准备好的语句很重要。

【讨论】:

    【解决方案2】:

    由于每个元素的查询都是相同的,因此您可以执行以下操作。也无需检查它是否存在,因为您只会处理数组中的值。您需要在此处使用准备好的语句并进行清理,不要将原始表单数据插入数据库。

    foreach($_POST['form'] as $key => $locatie) {
      $db->setQuery("
         INSERT INTO #__instellingen
         (type,instelling,locatie,contactpersoon,telefoon,email,ivvu,vgu,token)
         VALUES ('".$type."','".$instelling."','".$locatie."','".$contactpersoon."','".$telefoon."','".$email."','".$ivvu."','".$vgu."','".$token."')
     ");
    }
    

    【讨论】:

    • 这将假定表单中没有其他数据。
    • @NigelRen 确实,正确答案取决于帖子中的内容,但未提供。
    • 是与否,恕我直言,答案应该能够预见问题,但您也不能(AFAIK)通灵并且能够理解 OP 可能遇到的其他问题。就像(正如您提到的)回答有关 SQL 的问题而不谈论使用准备好的语句。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多