从联接表

时间:2015-07-04 09:10:35

标签: php mysql

我需要一种方法来比较循环中的连接表我已经显示了另一个表中的类别列表,如果类别ID与文档ID匹配则勾选它们。

这是我目前正在努力的功能:

<?php

function build_cat_checkboxes(){

    global $dbc; // database connection
    global $id; // id from the url


    $q = "SELECT * FROM doc_cat_join LEFT OUTER JOIN cats ON cats.cat_id = doc_cat_join.cat_id;";
    $r = mysqli_query ($dbc, $q); // Run the query.

    var_dump($r);

    $currentDoc = $id;

    while ($row = mysqli_fetch_array($r)) {

    $checked = (($row['cat_id'] == $currentDoc) ? 'checked="checked"' : '');

    echo '<ul>
          <li><label>
            <input type="checkbox" name="cat_id[]" value="' . $row['cat_id'] . '" '.$checked.'"> ' . $row["cat_name"] . '</label></li>
        </ul>';
    }

    }

?>

所以我有三张桌子:

docs
  doc_id

cats
  cat_id

doc_cat_join
  id
  doc_id
  cat_id

上面的代码列出了cats表中的行并创建了复选框。当我在编辑文档时,我需要在上面的代码中使用一种方法来获取文档ID形式的url(我可以做),然后在连接表上执行比较?如果doc_id存在行,则勾选复选框,这里的cat_id是我doc_cat_join表的可视化:

enter image description here

我相信我的JOIN是导致我这个问题的部分,但不确定如何解决这个问题?

如果我在循环内部对$ r执行var_dump,我会得到这个..

object(mysqli_result)#3 (5) { ["current_field"]=> int(0) ["field_count"]=> int(7) ["lengths"]=> array(7) { [0]=> int(3) [1]=> int(2) [2]=> int(2) [3]=> int(2) [4]=> int(7) [5]=> int(7) [6]=> int(51) } ["num_rows"]=> int(1) ["type"]=> int(0) }

已更新

此更新反映了下面的建议答案,但我仍然遇到一些问题:

<?php

function build_cat_checkboxes(){

    global $dbc; // database connection
    global $id; // id from the url


    $q = "SELECT * FROM cats AS c LEFT JOIN doc_cat_join AS dcj ON c.cat_id = dcj.cat_id AND dcj.doc_id = $id";
    $r = mysqli_query ($dbc, $q); // Run the query.

    $currentDoc = $id;

    while ($row = mysqli_fetch_array($r)) {

    $checked = $row['id'];

    echo '<ul>
          <li><label>
            <input type="checkbox" name="cat_id[]" value="' . $row['cat_id'] . '" '.$checked.'"> ' . $row["cat_name"] . '</label></li>
        </ul>';
    }

    }

?>

以下是删除并插入勾选框的查询:

$q = "SELECT doc_id FROM docs WHERE doc_name='$dn' AND doc_id != $id";

        $r = mysqli_query($dbc, $q);

        if (mysqli_num_rows($r) == 0) {

            // Make the query:
            $q = "UPDATE docs SET doc_name='$dn', doc_content='$dc', doc_owner='$do' WHERE doc_id=$id LIMIT 1";


            $r = mysqli_query ($dbc, $q);

            if ($r) {

            // CODE TO DELETE ROW FROM DOC_CAT_JOIN    
            $q = "DELETE from doc_cat_join WHERE doc_id = $id";
            $r = mysqli_query ($dbc, $q);

            //AND THEN...    

            // CODE TO INSERT BACK INTO DOC_CAT_JOIN    
            $query = "INSERT INTO doc_cat_join (cat_id,doc_id) VALUES "; 
            $cat_ids = $_POST['cat_id']; 
            $length = count($cat_ids); 
            for ($i = 0; $i < count($cat_ids); $i++) { 
            $query.='(' . $cat_ids[$i] . ',' . $id . ')'; 

            if ($i < $length - 1) 
            $query.=','; 
            } 

        mysqli_query($dbc, $query);    

1 个答案:

答案 0 :(得分:2)

如果我理解正确,你想要的是:

给定文档ID的

显示所有类别的列表并检查链接到给定文档的列表 - 这是正确的吗?

为了实现这一点,您需要更改运行的查询。您想获取所有类别并加入来自 doc_cat_join 的一些其他数据(如果存在给定类别和docID),因此您需要的查询是:

SELECT * FROM cats AS c LEFT JOIN doc_cat_join AS dcj ON c.cat_id = dcj.cat_id AND dcj.doc_id = <doc id from URL>

这样您就可以从 doc_cat_join 表中获取所有类别数据和列。如果给定的类别未链接到给定文档,则 doc_cat_join 中的列将为NULL,否则它们将包含该表中的正确值。

为了定义$ checked值,你可以做

$checked = $row['id'];
只有当给定的类别链接到给定的docID时, doc_cat_join 中的

ID列才会设置值。

更新:您在PHP中处理用户输入的方式带来了严重的安全漏洞 - 请查看http://php.net/manual/en/security.database.sql-injection.php