1

OK、ローカルで開発しているこの単純なアプリの INSERT/UPDATE を作成して、db の相互作用について詳しく知る方法がわかりません。

データベースからデータが取り込まれ、最大 9 個のユーザー リンク (この場合はuser_id 2 ) が一覧表示される「編集」ページがあるので、次のようになります。

<input type="text" name="link1" value="www.yahoo.com">  
<input type="text" name="link2" value="www.google.com">  
<input type="text" name="link3" value="www.amazon.com">  
<input type="text" name="link4" value="">  
<input type="text" name="link5" value="">  
<input type="text" name="link6" value="">  
<input type="text" name="link7" value="">  
<input type="text" name="link8" value="">  
<input type="text" name="link9" value="">  
<input type="submit" name="submitted" value="update">

ここには 9 つのテキスト入力が表示されます。最初の 3 つの入力には、以下のリンク テーブルの URL が入力されています...これらの入力は、プレビューでは表示されますが、質問には表示されないようです。

私のリンクテーブルは 2 列だけで、次のようになります。

user_id     linkurl
1           http://www.abcnews.com

2           http://www.yahoo.com
2           http://www.google.com        
2           http://www.amazon.com

3           http://www.ebay.com
3           http://www.craigslist.org

たとえば、3 番目のリンクを編集し、4 番目、場合によっては 5 番目、6 番目、7 番目、8 番目、9 番目を追加するための INSERT/UPDATE クエリを作成するにはどうすればよいですか?

この同じページには、ユーザーの個人情報のセクションもあり、次のようなクエリで簡単に更新できます。

$query = "UPDATE users
          SET first_name='$firstname', last_name='$lastname', email='$email', state='$state'"  

if($newpass1){
    $query .= ", pass=md5('$newpass1')";
}

$query .= " WHERE user_id = {$_SESSION['user_id']}";
4

4 に答える 4

2

私が考えることができる最も簡単な方法は、あなたのhtmlをこのようなものに変更することです

<input type="text" name="link1" value="www.yahoo.com">  
<input type="hidden" name="oldlink1" value="www.yahoo.com">  
<input type="text" name="link2" value="">  
<input type="hidden" name="oldlink2" value=""> 

次に、非表示の要素が空白かどうかを確認して読み取るときに、空白の場合は挿入を行い、そうでない場合は更新ステートメントで値を使用します

UPDATE table_name SET linkurl='www.mynewlink.com' 
WHERE linkurl='www.yahoo.com' and user_id=1
于 2009-01-09T18:46:21.017 に答える
1

あなたが何に困っているのかよくわかりません。試してみたものの、意図したとおりにならなかったことを示していただけると助かります。

私が持っているアドバイスの 1 つは、リンク テーブルに link_id 列を追加したいということです。これにより、各行を一意に識別し、元の入力順序を維持することがはるかに簡単になります。(MySQL の実装についてはわかりませんが、一般的な RDBMS 理論では、行が挿入された順序で格納されると想定すべきではありません。)

詳細: link_id は 1 から 9 までの数値で、user_id と link_id が一緒になってリンク テーブル内の行を一意に識別すると考えています。これは自動インクリメントで実装できるとは思いませんが、mysql については知りません。テーブルから選択すると、「SELECT url FROM links WHERE user_id = 3 ORDER BY link_id」のようになります。これにより、リンクが正しい順序で保持されます。フォームが送信されると、フィールド番号から link_id の値を判断すると思います。お使いの環境に SQL 操作の影響を受ける行数を判断する方法があると仮定すると、「UPDATE links SET url = 'newvalue' WHERE user_id = 3 AND link_id = 4」のような更新を試すことをお勧めします。 0 行が更新されたと報告すると、代わりに INSERT が実行されます。

PS これは学習プロジェクトだとおっしゃっていましたが、さらに進んだら、SQL インジェクションとそれを回避する方法について読んでください。

于 2009-01-09T18:44:54.543 に答える
0

したがって、おそらくユーザーの既存のエントリをすべて削除してから、それらを再入力します。

$query = "DELETE FROM links WHERE user_id = {$_SESSION['user_id']}";
foreach ($i = 1; $i < 10; $i++) {
  if (!empty($_POST['link' . $i])) {
    $query = "INSERT INTO links (user_id, linkurl) VALUES ({$_SESSION['user_id']}, '" . $_POST['link' . $i] . "')";
  }
}
于 2009-01-09T18:46:37.787 に答える
-1

テーブルに一意の行識別子 (SQL Server の ID 列など) を追加し、それを使用して更新するレコードを決定することをお勧めします。行識別子のない操作は、必然的に挿入になります。

于 2009-01-09T19:23:48.820 に答える