2010-02-11 33 views
4

我有一個CMS我正在建立,我有一個相當大的表格充滿數據添加到我的數據庫。這是我收集我的變量....Large Forms = Large PHP/mySql查詢字符串...有沒有好的解決方案?

$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']; 

here I sql escape, validate and send to my function (omitted validation for space)...

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) 
    )) 

終於功能...

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()); 
     } 
    } 

有一定是這樣做的巧妙方式。 誰有最好的方法?

感謝-J

+0

作爲一個建議,作爲一個經驗法則,參數傳遞值的最大數量是一個你有15個。 – 2010-02-11 03:34:45

+0

@Anthony Forloney我不知道有關於參數傳遞的經驗法則......我想Array是更好的選擇? – 2010-02-11 04:29:55

+0

有關參數傳遞的經驗法則不是生死攸關的情況,更多的是人們適應的慣例。一個數組將是另一種選擇。 – 2010-02-11 04:34:17

回答

4

選項#1

使用像Doctrine的ORM來處理CRUD在PHP應用程序。

選項#2

如果使用ORM是太大的範式轉變的嘗試是這樣的:

// 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); 

這可以很容易地擴展成一個功能或一個類來處理不同表,列和SQL語句。

+0

男人,現在我要查找什麼是sprintf。我看了ORM主義。我只是終於感覺編寫PHP類很舒服。我正準備去那裏,但我會說我將ORM加入托盤至少要六個月。而且,如果我沒有弄錯,它看起來好像是我需要安裝的東西?我從Hostgator租用服務器空間,我很幸運,我得到了phpMyAdmin。 (其實,他們對我來說並不壞)。感謝您的答覆。我確信一旦我明白了,我會很高興;) – 2010-02-11 04:43:44

-1

是的,它似乎應該如何大部分,但是,你可以這樣做你的生活節省很大程度:

而是寫:

$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']; 

你可以簡單地寫這行:

extract($_POST, EXTR_SKIP); 

現在你可以像你做了什麼,有這麼多的線路上面,例如,現在你可以使用它們或回聲他們都相同的變量:

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

補充:我不知道是否使用extract是安全方面的很好的做法,但是,我一直在使用這個沒有任何問題到目前爲止:)

+1

默認情況下'extract'會覆蓋現有的變量。至少把它叫做'extract($ a,EXTR_SKIP)'來防止攻擊者泄露你現有的代碼。 – leepowers 2010-02-11 03:50:14

+0

@pygorex - 試想一下,如果有一個變量$ isAdmin或其他東西,而某人發佈「isAdmin」的值爲「true」...總之,這並不能真正幫助OP,因爲這些值仍然不是消毒。 – 2010-02-11 03:58:27

+0

謝謝你們,我已經解決了這個問題,請再考慮一下。謝謝.... – Sarfraz 2010-02-11 04:01:03

1

做一個foreach遍歷PARAMS數組,所以你可以檢查值。做一些神奇的最終功能,使您可以檢查其中是否是空的或內在的東西......

+0

嗯,我無法得到這個,他試圖刪除空的領域? – Sarfraz 2010-02-11 03:41:43

+0

他正在尋找一個更好的方式來做到這一點,或者可能縮短代碼並獲得一些速度:)謝謝 – Sarfraz 2010-02-11 03:42:16

1

如果您的表格中有16列,那麼您將有一長插入語句。

您應該使用其中一個數據庫包裝類(如PDO)。首先,它爲您提供了使用預準備語句(避免SQL注入以及添加類型檢查)的便捷方式。其次,它使得添加參數更具可讀性,因爲您不必連接一個巨大的字符串。

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. 
} 

如果你真的被所有的打字困擾,你可以用你的數據庫,生成一些代碼對你:

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

像這樣的工作:

 
$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) . "'"; 

//... 

這不是安全的,但它會工作:)