2016-08-30 3 views
0

В настоящее время у меня есть ассоциативный массив, называемый полями, в котором хранятся все мои переменные $ _POST из полей ввода HTML. Ассоциативные переменные массива используются, когда я пытаюсь привязать свои значения к базе данных mySQL. Таким же образом у меня также есть те же имена, что и заголовки столбцов для базы данных mySQL. Так что это очень утомительно и долго. Есть ли способ, возможно, пропустить столбцы и присвоить значение другому циклу для ассоциативного массива? Пожалуйста, ознакомьтесь с приведенным ниже примером и заблаговременно за вашу помощь.Рефакторинг для цикла mySQL и кода PHP

 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; 
      }   
+0

Вы всегда можете использовать имена полей привязки карты и индексы значений, такие как $ fields ['a'] = 1; $ полей [ 'B'] = 2; или сокращенно, как $ fields = ['a' => 1, 'b' => 2] ;. Затем просто повторите эти поля и сделайте свое дело. Не самое изящное решение, но хватит :). PD: Те же имена для столбцов и столбцов базы данных небезопасны, поскольку они в основном раскрывают вашу структуру базы данных там !. –

ответ

0

Быстрое приготовление возможного решения. Перед тем, как попробовать, пожалуйста, имейте в виду, что он не проверен и может быть несколько синтаксических ошибок здесь (без 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(); 
} 
?> 

Опять же, позвольте мне заявить, что вы подвергаете свою структуру базы данных именам ваших почтовых переменных. Я сомневаюсь, что это то, что вы хотите сделать.

+0

Спасибо @ The Marlboro Man. Это очень помогло мне. Я попытался проголосовать за ваш ответ, но он сказал, что его нельзя публиковать. – Roger

+0

@Roger, все в порядке. Удачи вам в проекте !. –