Büyük Formlar = Büyük PHP / MySQL Sorgu dizeleri ...

5 Cevap php

Ben benim veritabanına eklemek için veri dolu büyükçe bir formu var nerede inşa ediyorum bir CMS var. Benim değişkenleri toplamak budur ....

$orgName = $_POST['orgName'];
$impact = $_POST['impact'];
$headline = $_POST['headline'];
$content = $_POST['content'];
$subContent = $_POST['subContent'];
$meterText = $_POST['meterText'];
$month = $_POST['month'];
$shopLink = $_POST['shopLink'];
$blurbTitle = $_POST['blurbTitle'];
$blurb = $_POST['blurb'];
$logoURL = $_POST['logoURL'];
$buttonURL = $_POST['buttonURL'];
$blurbURL = $_POST['blurbURL'];
$POMURL = $_POST['POMURL'];
$horizontalURL = $_POST['horizontalURL'];
$statURL = $_POST['statURL'];
$stats = $_POST['stats'];

Burada ben, kaçmak doğrulamak ve fonksiyonu (boşluk ihmal doğrulama) gönderilecek sql ...

require_once 'DB_Connect.php';

$connection = new DB_Connect();    

$connection->insertPartner(
    $index,
    mysql_real_escape_string($orgName),
    mysql_real_escape_string($impact),
    mysql_real_escape_string($headline),
    mysql_real_escape_string($content),
    mysql_real_escape_string($subContent),
    $month,
    mysql_real_escape_string($shopLink),
    mysql_real_escape_string($blurbTitle),
    mysql_real_escape_string($meterText),
    mysql_real_escape_string($blurb),
    mysql_real_escape_string($stats),
    mysql_real_escape_string($logoURL),
    mysql_real_escape_string($buttonURL),
    mysql_real_escape_string($blurbURL),
    mysql_real_escape_string($POMURL),
    mysql_real_escape_string($horizontalURL),
    mysql_real_escape_string($statURL)
    ))

ve son olarak işlev ...

public function insertPartner(
    $orgName = '',
    $impact = '',
    $headline = '',
    $content = '',
    $subContent = '',
    $month = '',
    $shopLink = '',
    $blurbTitle = '',
    $blurb = '',
    $stats = '',
    $logoURL = '',
    $buttonURL = '',
    $blurbURL = '',
    $POMURL = '',
    $horizontalURL = '',
    $statURL = '')
    {
        $query="INSERT INTO `hupcap_FCE`.`fce_partners` (
        `index`,
        `organization_name`,
        `impact`,
        `headline`,
        `content`,
        `sub_content`,
        `blurb_title`,
        `blurb`,
        `stats`,
        `month`,
        `meter_number`,
        `meter_text`,
        `shop_link`,
        `button_img_url`,
        `blurb_img_url`,
        `logo_url`,
        `month_img_url`,
        `horizontal_logo_url`,
        `stat_img_url`,
        `util`
        ) VALUES (
        '',
        '$orgName',
        '$impact',
        '$headline',
        '$content',
        '$subContent',
        '$blurbTitle',
        '$blurb',
        '$stats',
        '$month',
        0,
        '',
        '$shopLink',
        '$buttonURL',
        '$blurbURL',
        '$logoURL',
        '$POMURL',
        '$horizontalURL',
        '$statURL',
        0)";
        if(mysql_query($query)){
            return true;
        }else{
            die("failed to insert record" . mysql_error());
        }
    }

There has GOT to be a slicker way of doing this. Who's got the best method?

Teşekkürler-J

5 Cevap

Option #1

PHP apps CRUD işlemek için Doctrine gibi bir ORM kullanın.

Option #2

Bir ORM kullanarak bir paradigma kayması çok büyük olursa böyle bir şey deneyin:

// Alias $_POST fields to SQL columns
$sql_columns= array(
    'post_field1'=> 'sql_column1',
    'post_field2'=> 'sql_column2',
    'post_field3'=> 'sql_column3');

// Encode $_POST data for use in SQL
$sql_a= array();
foreach ($sql_columns as $k=> $k2) {
 if (isset($_POST[$k])) {
  $sql_a[]= sprintf("`%s` = '%s'", $k2, mysql_real_escape_string($_POST[$k]));
 }
}

// Build SQL string to execute
$sql= sprintf('INSERT INTO table_name SET %s', implode(', ', $sql_a));
var_dump($sql);

Bu kolayca farklı tablolar, sütunlar ve SQL ifadeleri işlemek için bir işlev veya bir sınıfa uzatılabilir.

Tüm params dizisi üzerinde çalıştırmak için bir foreach yapmak, böylece değerini kontrol edebilirsiniz. Bunlardan herhangi birinin boş ya da bir şey olup olmadığını nihai işlevi içinde bazı sihirli kontrol böylece Do ...

Eğer tabloda 16 sütun varsa, uzun bir ekleme bildirimde gidiyoruz.

Sen (PDO gibi) veritabanı sarıcı sınıflar birini kullanmanız gerekir. Öncelikle, size hazır deyimleri (SQL enjeksiyon kaçınarak, ve tip kontrolü ekleyerek) kullanmak uygun bir yol verir. Eğer bir büyük bir dizeyi bağlamak zorunda değilsiniz beri İkincisi, bu ekleme parametreleri daha okunabilir hale getirir.

function insert_stuff($col1, $col2, $col3) {
    $conn = new PDO($connectionString);
    $query = "insert into my_table (col1, col2, col3) values (:col1, :col2, :col3)";
    $statement = $conn->prepare($query);

    $statement->bindValue(":col1", $col1);
    $statement->bindValue(":col2", $col2);
    $statement->bindValue(":col3", $col3);

    $statement->execute();
    // etc. 
}

Eğer gerçekten tüm yazarak rahatsız ediyorsanız, sizin için bazı kod oluşturmak için veritabanı kullanabilirsiniz:

select 
    concat('$statement->bindValue(":', column_name, '", $', column_name, ');' 
from
    information_schema.columns
where
    table_schema = 'my_database_name'
and table_name = 'my_table_name';

Böyle bir şey çalışmak:

$insertArray() = array();
foreach ($_POST as $key=> $name)
{
    $insertArray[$name] = mysql_real_escape_string($_POST[$name]);
}
$query = "INSERT INTO `hupcap_FCE`.`fce_partners` (" . implode(',', array_keys($insertArray)) VALUES '" . implode("','", $insertArray) . "'";

//...

BU GÜVENLİ DEĞİLDİR AMA İŞ İSTİYORUM :)

Evet o for the most part, ancak, bu yaparak büyük ölçüde hayatınızı kurtarabilir nasıl olması gerektiği gibi görünüyor:

Yazma yerine:

$orgName = $_POST['orgName'];
$impact = $_POST['impact'];
$headline = $_POST['headline'];
$content = $_POST['content'];
$subContent = $_POST['subContent'];
$meterText = $_POST['meterText'];
$month = $_POST['month'];
$shopLink = $_POST['shopLink'];
$blurbTitle = $_POST['blurbTitle'];
$blurb = $_POST['blurb'];
$logoURL = $_POST['logoURL'];
$buttonURL = $_POST['buttonURL'];
$blurbURL = $_POST['blurbURL'];
$POMURL = $_POST['POMURL'];
$horizontalURL = $_POST['horizontalURL'];
$statURL = $_POST['statURL'];
$stats = $_POST['stats'];

Sadece bu satırı yazabilirsiniz:

extract($_POST, EXTR_SKIP);

Ve şimdi size yukarıda pek çok hatları ile ne gibi mevcut tüm Aynı değişkenler, örneğin, şimdi bunları kullanmak veya bunları yankı var:

echo $orgName;
echo $impact;
echo $headline;

To Add: I extract güvenlik açısından iyi bir uygulama kullanarak Ancak, ben şimdiye kadar herhangi bir sorun olmadan bu kullanıyorum emin değilim :)