PHP &

4 Cevap php

Ben bir çok tablo yapısı çok ve onay kutusu formları güncellenmesi var.

Amaç users_project tablo ile projeler masaya kullanıcıların tabloyu ilişkilendirmek olduğunu. Bu şekilde orada proje başına pek çok kullanıcı ve kullanıcı başına birçok projeler olabilir.

Form her kullanıcı düzenleme sayfasında böyle bir şey bakmak olurdu

<form action="#" method="post">
    <div>	
    	<input type="checkbox" name="project_id[]" id="1" value="1">
    	<label for="1">project 1</label>
    	<br>

    	<input type="checkbox" name="project_id[]" id="2" value="2">
    	<label for="2">project 2</label>
    	<br>
    	<input type="hidden" name="editing">
    	<input type="submit" id="submit" value="submit">
    </div>
</form>

Here are examples of the three tables.

kullanıcıların tablo

+----+-----------+
| id ¦ username  ¦
+----+-----------+
| 1  ¦ user 1    ¦
| 2  ¦ user 2    ¦
+----+-----------+

projeler tablo

+----+-----------+  
¦ id ¦ title     ¦
+----+-----------+  
| 1  ¦ project 1 ¦
| 2  ¦ project 2 ¦
+----+-----------+

user_projeler tablo

this table relates the two above tables based on their id

+----+-------------+---------+
| id ¦ project_id  ¦ user_id |
+----+-------------+---------+
| 1  ¦           1 ¦       2 |
| 2  ¦           2 ¦       1 |
+----+-------------+---------+

I have made a checkbox form to add and edit these values. On each user page it displays all of the projects in the projects table. Then queries the user_projeler tabloand finds a list of matches to add checks to the checkboxes.

Ama nasıl veritabanına bu değerleri düzenlerim? Bir kullanıcı önceden kontrol kutusu işaretlenmemiş veya project_id ve user_id için kullanıcıların masada bir maç için bir sorgu olmadan döngü veritabanına boş bir kutu ve güncelleştirme kontrol olup olmadığını nasıl anlayacağım?

İşte sonuç elde etmek istiyorum ne kaba bir kavramdır.

if ($_POST['editing']) { 
    $totalprojects = $_POST['editing']; 
    $query = " 
    	SELECT *  
    	FROM user_projects  
    	WHERE user_id = user_id 
    	AND project_id = project_id 
    "; 
    $result = $mysqli->query($query); 
    $count = $mysqli->affected_rows; 
    for($i=0; $i < $totalprojects; $i++) {  
    	if ($count == 1) { 
    		if ($box == checked){  
    			//do nothing 
    		} 
    		else { 
    			//delete from database 
    		} 
    	} 
    	if ($count == 0) { 
    		if ($box == checked){  
    			//add to database 
    		} 
    		else { 
    			//do nothing 
    		} 
    	} 
    } 
}

This just doesn't seem like a good idea at all Ben proje tablodaki her proje için en az bir kez veritabanını sorgulamak gerekir beri. Ben ortak bir sorun olmasını hayal için daha iyi bir çözüm olmalı. Ben sadece bu konuda yanlış şekilde düşünüyorum biliyorum.

NOT: Ben sadece bir dizi seri hale ve kullanıcı sütununda anlaşmazlık düşündüm, ama ben proje ve amacı yenmek için kullanıcıya sadece kullanıcı için proje ilişkilendirmek mümkün olmaz çünkü bu kabul edilebilir değildir.

Bu herhangi bir javascript kandırmaca olmadan uygulanacak istiyorum.

4 Cevap

Projelerin bir numaralı tabloda görüntülemek için yeterince küçük olduğundan, ben tamamen teslim üzerinde user_projects tablonun ilgili bölümünü yeniden yanayım:

BEGIN TRANSACTION;
DELETE FROM user_projects WHERE user_id = $uid;
INSERT INTO user_projects (project_id, user_id)
    VALUES ($proj1, $uid), ($proj2, $uid), ...;
COMMIT TRANSACTION;

Bir açıklamada dernek yazmak için genişletilmiş INSERT sözdizimi kullanımına dikkat edin.

Eğer tablodaki alanı üçte tasarruf, gerek yoksa da user_projects.id bırakabilirsiniz.

Eh, her kullanıcıyı varsayarak form işleme sayfasında böyle bir şey yapmak istiyorum, her proje üzerinde çalışmak için uygundur:

$query = 'SELECT p.id AS project_id, u_p.id AS user_project_id '.
            'FROM projects AS p '.
                'LEFT JOIN user_projects AS u_p ON (u_p.project_id = p.id AND u_p.user_id = ?)';

Sol katılarak, bu size sistemdeki tüm projelerin bir listesini verecektir ve düzenlediğiniz kullanıcı bu proje üzerinde zaten eğer ikinci sütun tek bir değere sahip olacaktır. Verdiğiniz örnek veriler için, bu user_id 1 sorgulayarak, alacağı sonuç:

+------------+-----------------+
| project_id | user_project_id |
+------------+-----------------+
|          1 |                 |
|          2 |               2 |
+------------+-----------------+

Sonra bu sorgudan sonuçları üzerinde döngü ve her sonuç için, bir değer $_POST ilgili gönderilen olup olmadığını kontrol project_id. Bir değer (onay kutusu kontrol edildi) gönderilen ve satırın user_project_id boş ise, bu bağlantıyı eklemek için user_projects için bir satır eklemek. Bir değer (onay kutusu işaretli idi) gönderilen değildi ve satırın user_project_id ayarlanırsa, user_projects anahtarı olarak user_project_id kullanarak bu satırı silin. Aksi takdirde hiçbir şey, onlar daha önce olduğu şekilde değişmedi.

Anlatabildim, beni daha fazla detaya gitmek istiyorsanız bana bildirin.

Siz grup eylemleri can ve 3 sorguları komut azaltır.

SOL Chad Birch anwser gelen JOIN kullanarak geçerli seçili seçeneği retreive.

Döngü önce:

$delete_ids = array();
$add_ids = array();

Döngü içinde:

// delete from database
$delete_ids[] = $project_id;

ve

// add to database
$add_values[] = '('.$user_id.', '.$project_id.')';

Ve döngü için sonra:

if (count($delete_ids) > 0) {
  mysql_query('DELETE FROM user_projects WHERE user_id = '.$user_id.' AND project_id IN ('.implode(', ', $delete_ids).')'); 
}

if (count($add_ids) > 0) {
  mysql_query('INSERT INTO user_projects (user_id, project_id) VALUES '.implode($add_values)); 
}

Ben bu sorunu çözmek nasıl:

  1. Kullanmaya sonra daha güvenli olduğu gibi her şeyden önce, ben bir öğe silinir olmadığını kontrol etmek active sütun kullanıyorum (0) veya (1) sql deyimi DELETE

  2. Sonra UNIQUE olarak User_id ve project_id sütunları tanımlamak gerekir

    ALTER TABLE `user_projects` ADD UNIQUE INDEX(user_id, user_project_id)
    
  3. The code

    $uid = $_POST['uid'];
    $pids = $_POST['project_id'];
    
    // "deleting" all entries
    $chb = $db->prepare("UPDATE `user_projects` SET `active`=0 WHERE `user_id`=?");
    $chb->execute(array($uid));
    
    //updating checked checkboxes
    foreach ($pids as $pid) {
    $chb = $db->prepare("INSERT INTO `user_projects` VALUES (?, ?, 1) ON DUPLICATE KEY UPDATE `active`=1");
    $chb->execute(array($uid, $pid));
    

    }

-PDO Bütün örneklerde kullanılan