2011-07-07 16 views
0

PHPを使用してMySQLデータベースから「リソース」に関する情報を取得しています。同じページに複数の類似したフォームがあります

Title 
Description 
Etc. 

各リソースは、その後のonclick JavaScriptを実行し、「編集」リンクがあります。各リソースに関する情報は、次のような形式でHTMLとして出力されます。このJSは、選択されたリソースの情報を含むフォームを挿入し、編集してデータベースに更新します。 JavaScriptが無効になっている場合、ユーザーはその特定のリソースを編集するためのフォームのみを持つ別のページに移動します。だから、私の質問:どのように私はすべての同じ機能を持って、MySQLデータベースの異なる行(別の "リソース")に関連する同じページ上の任意の数のフォームを管理するのですか?特に、Javascriptによって挿入されたフォームで編集する特定のリソースを特定するにはどうすればよいですか?

私はリソースID(erid)を保持するために隠れた入力を使用していますが、実際にフォームアクションを処理するPHPスクリプトはどのように見えますか?この問題は、input type = "submit"のすべての名前が現在、eridを保持しているために発生します。 (

require('inc/db_connect_info.config'); 

$mysqli = new mysqli($host, $mysqlilogin, $mysqlipassword, $databaseName); 

if (mysqli_connect_error()) { 
    die("Can't connect to database: " . mysqli_connect_error()); 
} 

else{ 
    $testQuery = "SELECT * FROM eresources NATURAL JOIN subjects"; 
    $testResult = $mysqli->query($testQuery); 

    if($testResult && $testResult->num_rows >= 1) { 


     while($testArray = $testResult->fetch_assoc()) { 

     $testArray['stitle'] = htmlentities($testArray['stitle']); 


    // START er div 

     print("<div id=\"er".$testArray['erid']."\" class=\"grey\">");   print("\n\n\t"); 

    // erid, link, title, descr 
    print("<p>".$testArray['erid'].": <a id=\"link".$testArray['erid']."\" href=\"".$testArray['link']."\">".$testArray['ertitle']."</a> - <span id=\"descr".$testArray['erid']."\">".$testArray['descr']."</span></p>"); 
     print("\n\t"); 


    // edit "link" 
    print("<a href=\"edit.php?erid=".$testArray['erid']."\" onclick=\"return showEdit(".$testArray['erid'].")\">Edit</a>"); 
    print("&nbsp;&nbsp;&nbsp;&nbsp;"); 


    // END er div 
    print("</div>"); 
    print("\n\n"); 
     } 
} 

    // If there was a problem retrieving resources, print an error message // 
    else{ 
     print("<p>No e-resources found!</p>"); 
    } 

    $mysqli->close(); 
} 

JavaScriptの機能を「編集」リンクが をクリックするとページ上で右そこに更新フォームを挿入するには:=「アップデート1」、名前=「アップデート2」など

は、データベースからリソースを取得するために名前を付けますJavaScriptが有効になっていると仮定します)。

function showEdit(erid) { 

//get page url for form submission 
var url = document.location.href; 

//current title 
var erTitle = document.getElementById("link" + erid).innerHTML; 

//current link 
var erLink = document.getElementById("link" + erid).getAttribute("href"); 

//current description 
var erDescr = document.getElementById("descr" + erid).innerHTML; 

//current subject under which electronic resource is filed 
var erSubject = document.getElementById("subject" + erid).innerHTML; 

//clear the er div 
document.getElementById("er" + erid).innerHTML = ""; 

//then fill it with a form for new values, to be submitted to the same page 
//the form is prepopulated with the current values from the database 

    document.getElementById("er" + erid).innerHTML = 
"<form action=\"" + url + "\" method=\"post\">" + 
"Title<br /><input type=\"text\" name=\"updated_er_title"+erid+"\" value=\"" + erTitle + "\" size=\"100\" /><br /><br />" + 
"Link<br /><input type=\"text\" name=\"updated_er_link"+erid+"\" value=\"" + erLink + "\" size=\"100\" /><br /><br />" + 
"Description<br /><textarea name=\"updated_er_descr"+erid+"\" cols=\"75\" rows=\"10\">" + erDescr + "</textarea><br /><br />" + 
"Free Status<br />" + erFree + "<br /><br />" + 
"Subject<br /><input type=\"text\" name=\"updated_er_subject"+erid+"\" value=\"" + erSubject + "\" size=\"100\" /><br /><br />" + 
"<input type=\"hidden\" name=\"erid\" value=\""+erid+"\" />" + 
"<input type=\"submit\" name=\"update" + erid + "\" value=\"Update\" />" + 
"</form>"; 

// return false so the link is not followed if javascript is enabled 
// if javascript is disabled, link provides same form on separate page 
return false; 
} 

答えて

1

本当にリソースごとに別々のフォームが必要ですか? 1つのフォームをdivに設定してみてはどうでしょうか。ユーザーが「編集」をクリックすると、onclickハンドラはフォーム内のフィールドに選択したリソースのデータを入力し、選択したリソースに必要な場所にdivを配置し、css表示を「ブロック」に設定します'フォームには、リソースIDに設定される非表示の入力を含めることができます。フォームが送信されると、サーバー側のPHPはDBの更新を行うためのリソースIDを持ちます。フォームがAJAXを使用して送信される場合、onsubmitハンドラは入力フィールドからデータを取り出し、選択したリソースの編集不可能なディスプレイを変更して、フォームdivのCSS表示を 'none'に設定できます。