2017-08-08 22 views
-1

我剛剛從mysqli的事先準備好的聲明去PDO準備語句,因爲它會使事情更容易爲我理應PDO變參數 - 如何更新數據庫行

我想只更新等的Facebook如果Facebook的部分是不是空的,但目前它會更新表單上的一切提交也空變量,我該如何解決?

PHP

if (isset($_POST['submit'])) { 
    $facebook = $_POST['facebook']; 
    $twitter = $_POST['twitter']; 
    $youtube = $_POST['youtube']; 

$stmt = $dbCon->prepare(" UPDATE login_media " 
     . " SET login_media_youtube = :youtube, " 
     . " login_media_facebook = :facebook, " 
     . " login_media_youtube = :youtube, " 
     . " login_media_twitter = :twitter "); 

$stmt->bindParam(":facebook", $facebook); 
$stmt->bindParam(":twitter", $twitter); 
$stmt->bindParam(":youtube", $youtube); 
$stmt->execute(); 

} 
?> 

HTML

<form class="multiForm" action="" method="POST"> 
    <input type="text" name="youtube" placeholder="Youtube"> 
    <input type="text" name="facebook" placeholder="Facebook"> 
    <input type="text" name="twitter" placeholder="Twitter"> 
    <input type="submit" name="submit"> 
</form> 

我不覺得自己像做if語句和更新/查詢每一個,如果滿足條件的很多,我認爲這是可能的,使其動態,但如何?

+1

你需要一個WHERE子句添加到您的查詢來限制更新單行在那張表中,但是你不會告訴我們任何能夠表明這些行的索引是什麼的東西 – RiggsFolly

+0

我認爲你誤解了,它只需要更新等Facebook如果Facebook不是空的,但目前它更新一切在行:)它沒有關係哪一行/它在哪裏更新:)這只是爲了測試目的。因此,如果我在Facebook輸入字段中輸入Facebook.com/blabla,它應該只更新數據庫中的facebook,而不是twitter/youtube,我希望你能理解 – Javaish

+0

然後,如果'login_media_facebook IS NOT NULL'或者'login_media_facebook!=''',具體取決於該列的默認值是多少 – RiggsFolly

回答

2

1:簡單的使用!empty()

第二:這條線呈現不止一次. " login_media_youtube = :youtube, "

<?php 

if (isset($_POST['submit'])) { 

    $facebook = $_POST['facebook']; 
    $twitter = $_POST['twitter']; 
    $youtube = $_POST['youtube']; 

    if(!empty($facebook) || !empty($twitter) || !empty($youtube)){ 


     if(!empty($youtube)){ 
     $query_string[]= " login_media_youtube = :youtube "; 

     } 
     if(!empty($facebook)){ 
     $query_string[]= " login_media_facebook = :facebook " 

     } 
     if(!empty($twitter)){ 
     $query_string[]= " login_media_twitter = :twitter " 

     } 


    $stmt = $dbCon->prepare(" UPDATE login_media SET ".implode(' , ',$query_string)); 

    if(!empty($facebook)){ 
     $stmt->bindParam(":facebook", $facebook); 
     } 
     if(!empty($twitter)){ 
     $stmt->bindParam(":twitter", $twitter); 
     } 
     if(!empty($youtube)){ 
     $stmt->bindParam(":youtube", $youtube); 

     } 

     $stmt->execute(); 

    } 
    else { 

     echo "nothing to update "; 
    } 

} 
?> 
+1

這應該這樣做 –

+1

太棒了,這段代碼實際上很有意義:) – Javaish

+0

很高興幫助你:) @Javaish – JYoThI

1

試試這個解決方案。

$socialMedias = ['facebook','twitter','youtube']; 
$preparedStatment = "UPDATE login_media SET"; 

foreach($socialMedias as $socialMedia){ 
    if($_POST[$socialMedia]){ 
     $preparedStatment .= " login_media_{$socialMedia} = :{$socialMedia}"; 
    $stmt = $dbCon->prepare($preparedStatment); 
    $stmt->bindParam(":$socialMedia",$_POST[$socialMedia]); 
} 
} 

$stmt->execute(); 

這樣,只有填充的文件會被更新。

+0

我編輯'$ preparedStatement'變量爲''更新login_media SET「'但你能解釋一下到底發生了什麼?我有點困惑,這實際上是如何工作的 – Javaish

+0

@Javaish是否解決了你的問題? –

+0

@MasivuyeCokile是的,但是我有點困惑,因爲它是如何工作的。它如何獲得輸入字段數據?通常,我會將'$ _POST'綁定到一個變量並將其傳入,這個問題也涉及到每個$ _POST數據都會通過正則表達式檢查來查看它是否是一個有效的facebook url – Javaish