【问题标题】:Refactoring to loop mySQL & PHP code重构以循环 mySQL 和 PHP 代码
【发布时间】:2017-01-06 15:44:06
【问题描述】:

我目前有一个名为 fields 的关联数组,用于存储我的 HTML 输入字段中的所有 $_POST 变量。当我尝试将我的值绑定到 mySQL 数据库时使用关联数组变量。同样,我也使用相同的名称作为 mySQL 数据库的列标题。所以这是非常乏味和冗长的。有没有办法遍历列并为关联数组分配另一个循环的值?请检查下面的示例,并提前感谢您的帮助。

     try {
                $insertSql = "INSERT INTO tableExample";
                $sqlCols = " (
                    a,
                    b,
                    c,
                    d,
                    e,
                    f,
                    g,
                    h,
                    i,
                    j,
                    k,
                    l,
                    m,
                    n,
                    o,
                    p,
                    q,
                    r,
                    s,
                    t,
                    u,
                    v,
                    w,
                    x
                )";
                $result = $db->prepare($insertSql . $sqlCols . " VALUES (
                    ?,
                    ?,
                    ?,
                    ?,
                    ?,
                    ?,
                    ?,
                    ?,
                    ?,
                    ?,
                    ?,
                    ?,
                    ?,
                    ?,
                    ?,
                    ?,
                    ?,
                    ?,
                    ?,
                    ?,
                    ?,
                    ?,
                    ?,
                    ?)");
                $result->bindValue(1,$fields['a'],PDO::PARAM_STR);
                $result->bindValue(2,$fields['b'],PDO::PARAM_STR);
                $result->bindValue(3,$fields['c'],PDO::PARAM_STR);
                $result->bindValue(4,$fields['d'],PDO::PARAM_STR);
                $result->bindValue(5,$fields['e'],PDO::PARAM_STR);
                $result->bindValue(6,$fields['f'],PDO::PARAM_STR);
                $result->bindValue(7,$fields['g'],PDO::PARAM_STR);
                $result->bindValue(8,$fields['h'],PDO::PARAM_STR);
                $result->bindValue(9,$fields['i'],PDO::PARAM_STR);
                $result->bindValue(10,$fields['j'],PDO::PARAM_STR);
                $result->bindValue(11,$fields['k'],PDO::PARAM_STR);
                $result->bindValue(12,$fields['l'],PDO::PARAM_STR);
                $result->bindValue(13,$fields['m'],PDO::PARAM_STR);
                $result->bindValue(14,$fields['n'],PDO::PARAM_STR);
                $result->bindValue(15,$fields['o'],PDO::PARAM_STR);
                $result->bindValue(16,$fields['p'],PDO::PARAM_STR);
                $result->bindValue(17,$fields['q'],PDO::PARAM_STR);
                $result->bindValue(18,$fields['r'],PDO::PARAM_STR);
                $result->bindValue(19,$fields['s'],PDO::PARAM_STR);
                $result->bindValue(20,$fields['t'],PDO::PARAM_STR);
                $result->bindValue(21,$fields['u'],PDO::PARAM_STR);
                $result->bindValue(22,$fields['v'],PDO::PARAM_STR);
                $result->bindValue(23,$fields['w'],PDO::PARAM_STR);
                $result->bindValue(24,$fields['x'],PDO::PARAM_STR);
                $result->execute();
            } catch (Exception $e) {
                echo "Unable to store data";
                echo $e->getMessage();
                exit;
            }           

【问题讨论】:

  • 您始终可以使用映射绑定字段名称和值索引,例如 $fields['a']=1; $fields['b']=2;或简写为 $fields=['a'=>1, 'b'=>2];。然后只需迭代这些字段并做你的事情。不是最优雅的解决方案,但就足够了:)。 PD:post 字段和数据库列的名称相同是不安全的,因为它基本上暴露了您的数据库结构!。

标签: php mysql arrays loops


【解决方案1】:

快速制定可能的解决方案。在尝试之前,请记住它未经测试,这里可能有几个语法错误(我这边没有 PDO...实际上也没有 php)。

它的作用是定义两个独立的映射:一个用于“数据库列到索引”,另一个用于“数据库列到值”。

我不能确定这是否能解决您的问题,但这是一个起点。

<?php
try 
{
    //Define your columns and indexes...
    $fields=['col_a' => 1, 'col_b' => 2, 'col_c' => 3, 'col_d' => 4];

    //Let this be your post data. Notice how the index are the same as above.
    $data=['col_a' => "Value a", "col_b" => 33, "col_c" => "Value C", "col_d" => 12];

    //Prepare the statement....
    $sqlCols=null;
    $sqlValues=null;

    foreach($fields as $key => $value) 
    {
        $sqlCols.=$key.',';
        $sqlValues.='?,';
    }

    $result = $db->prepare("INSERT INTO tableExample (".substr($sqlCols, 0, -1).") VALUES (".substr($sqlValues, 0, -1).")";

    //Bind the values... Please, make sure the order of parameters is correct!.
    foreach($fields as $key => $index)
    {
        $result->bindValue($index, $data[$key], PDO::PARAM_STR);
    }

    $result->execute();
} 
catch (Exception $e) 
{
    echo "Unable to store data";
    echo $e->getMessage();
}
?>

再次声明,您正在通过 post 变量中的名称公开您的数据库结构。我怀疑那是你想要做的。

【讨论】:

  • 谢谢@The Marlboro Man。这对我帮助很大。我试图对你的答案投票,但它说它不能公开显示。
  • @Roger,没关系。祝项目好运!。
猜你喜欢
  • 1970-01-01
  • 2016-09-02
  • 2013-10-10
  • 1970-01-01
  • 2014-03-24
  • 2011-06-27
  • 2018-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多