2017-10-04 9 views
0

私はwhileループを使用して、各ページのユーザー権限を表示するDropdown yesとnoを表示しています。ページ名とページごとにYesまたはNoをドロップダウンします。PHP最後の動的フォームを投稿する

フォームが正しく表示され、デフォルトとして各ユーザーの正しいデータベース値が表示されます。しかし、もし私がページのアクセス許可の一つをyesからnoに変更したり、versersを変更したりすると、データベースの最後のドロップダウンだけが更新され、残りの部分は変更されません。私がここで欠けているものは何ですか?

<?php 

$sql = "SELECT DISTINCT username FROM users ORDER BY username"; 
$resultusers = $connect->query($sql); 
?> 
<?php 
require ("cw/connect.php"); 


?> 
<?php 
if(isset($_POST['selectbutton'])) 
{ 
    $username = $_POST['selectuser']; 

$query = "SELECT 
users.username, users.first, users.last, users.id, permissions.PermID, permissions.PermUserID, permissions.PermPagesID, permissions.view, pages.PagesName, pages.PagesLink, pages.PagesID 
FROM users INNER JOIN permissions ON users.id = permissions.PermUserID INNER JOIN pages ON permissions.PermPagesID = pages.PagesID WHERE username = ?"; 

$stmt = mysqli_prepare($connect, $query); 

if($stmt){ 
    //Put whats to be binded from the statement so in this case we want data for this username selected 
    mysqli_stmt_bind_param($stmt,"s",$username); 

    // here add all the varibles to be pulled from database 
    mysqli_stmt_bind_result($stmt, $username, $first, $last, $id, $PermID, $PermUserID, $PermPagesID, $view, $PagesName, $PagesLink, $PagesID); 


    mysqli_stmt_execute($stmt); 

    mysqli_stmt_fetch($stmt); 




?> 


<b>First:</b><?php echo $first; ?><br> 
<b>Last:</b><?php echo $last; ?><br> 
<b>User:</b><?php echo $username; ?><br> 
<hr> 


<form action="user-permissions.php" method="post"> 
<?php 
while ($stmt->fetch()) { 

echo $PagesName; 
echo "<br>"; 
echo "<select name=\"permissionSelect\">"; 

?> 

<option value="<?php echo $view; ?>"><?php echo $view; ?></option> 
<option value="No">No</option> 
<option value="Yes">Yes</option> 

</select> 
<br><br> 
<?php 
echo "<input type=\"hidden\" name=\"PermPagesID\" value=\"".$PermPagesID."\">"; 
echo "<input type=\"hidden\" name=\"PermUserID\" value=\"".$PermUserID."\">"; 
     } 
     ?> 
<?php 
echo "<input type=\"submit\" name=\"updatep\">"; 
echo "<form>"; 


    } 

} 
?> 


<?php 
//UPDATE PERSON 
require ("cw/connect.php"); 

if(mysqli_connect_error()){ 
    echo mysqli_connect_error(); 
    exit(); 

} 
if(isset($_POST['updatep'])) 
{ 
    $view = mysqli_real_escape_string($connect,$_POST['permissionSelect']); 
    $PermPagesID = mysqli_real_escape_string($connect,$_POST['PermPagesID']); 
    $PermUserID = mysqli_real_escape_string($connect,$_POST['PermUserID']); 


$query = "UPDATE permissions SET view = ? WHERE PermPagesID = $PermPagesID AND PermUserID = $PermUserID"; 

$stmt = mysqli_prepare($connect, $query); 

if($stmt){ 
    mysqli_stmt_bind_param($stmt, "s", $view); 

    mysqli_stmt_execute($stmt); 

    mysqli_stmt_fetch($stmt); 
    echo "Updated to: ".$username; 


    }else{ 

    echo "object not created"; 

} 
} 

?> 
+1

入力の名前を 'name = \" PermUserID [] \ "'のように配列に変更してからループして更新します – Hackerman

+0

Hackermanは言ったように、入力に名前が重複することはできません。最後のもので上書きされます。したがって、名前の最後に[]を追加して値の配列に変換し、それをループします。 – LordNeo

答えて

0

理由は、同じ名前をフォーム要素に複数回使用することができないためです。それ以外の場合は、最後のものだけが使用されます。

次のように、すべての名前を変更するか、配列の構文を変更する必要があります。使用

echo '<select name="permissionSelect">'; 

echo '<select name="permissionSelect[]">'; 

その後、あなたのPHPスクリプトで使用すると、foreachのとそれらをループすることで、これらを参照することができます。たとえば、代わりの

foreach($_POST['permissionSelect'] as $permissionSelect){ 
    //handle it here 
} 

あなたはする必要があります。これをループ内の他の名前属性に対しても行います。

最後に、コードからバックスラッシュを削除したことに気づくでしょう。これは、PHPとHTMLの両方で一重引用符または二重引用符を使用できるためです。また、PHPでは2つの違いがありますが、ほとんどの場合、それらを交換できます。したがって、PHPが一重引用符を使用している場合は、HTML属性に二重引用符を使用するか、その逆もできます。

+0

ループの前に配列が空でないかどうかを確認することもあります。 – Akintunde007

+0

@Akintundeはい、これはコード内で早く実行して、他の必須フィールドが空であるかどうかを確認する必要があります。 mysqli_real_escape_stringなどを使わないなど、彼のコードには他にも多くの改良が施されています。 – kojow7

関連する問題