2009-12-03 56 views
1

我想知道如何使用PHP和MySQL更新我的两个数据库表?我想添加一个名为tags_2的第二个表,它将检查标记是否已经存在,以及它是否将它添加到表中的当前计数中,如果标记不存在,则将其添加到表中。PHP/MySQL如何插入或更新两个MySQL表?

我希望我解释一下吧?

我基本上需要帮助,在正确的地方添加正确的代码,这是由于某种原因整天困扰我的吗?我有第一张桌子工作,但不是第二张桌子?

下面是我的MySQL表格。

CREATE TABLE tags (
id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
page TEXT NOT NULL, 
tag VARCHAR(255) NOT NULL, 
count INT NOT NULL, 
PRIMARY KEY (id) 
); 

CREATE TABLE tags_2 (
id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
tag VARCHAR(255) NOT NULL, 
count INT NOT NULL, 
PRIMARY KEY (id) 
); 

下面是我的PHP脚本。

<?php 

require_once ('./mysqli_connect.php'); 

if (isset($_POST['submitted'])){ 

     $mysqli = new mysqli("localhost", "root", "", "sitename"); 
     $dbc = mysqli_query($mysqli,"SELECT * FROM tags"); 
    if (!$dbc) { 
     print mysqli_error($mysqli); 
    } 

$page = $_SERVER['SCRIPT_FILENAME']; 

$tag = mysqli_real_escape_string($mysqli, $_POST['tag']); 

$mysqli = new mysqli("localhost", "root", "", "sitename"); 
$dbc = mysqli_query($mysqli,"SELECT id, count, page FROM tags WHERE tag='$tag' AND page = '$page'"); 

if(mysqli_num_rows($dbc)){ 
    $tag_info = mysqli_fetch_array($dbc); 
    $tag_info_id = $tag_info["id"]; 
    $tag_info_count = $tag_info["count"] + 1; 

    $mysqli = new mysqli("localhost", "root", "", "sitename"); 
    $dbc = mysqli_query($mysqli,"UPDATE tags SET count='$tag_info_count' WHERE id='$tag_info_id'"); 

    echo "$tag now with $tag_info_count instances"; 
} else { 
    $mysqli = new mysqli("localhost", "root", "", "sitename"); 
    $clean_url = mysqli_real_escape_string($mysqli, $page); 
    $dbc = mysqli_query($mysqli,"INSERT INTO tags (tag, count, page) VALUES ('$tag', 1, '$clean_url')"); 

if (!$dbc) { 
     print mysqli_error($mysqli); 
} 
echo "1 record added"; 
} 
mysqli_close($mysqli); 
} 
?> 

这些表格看起来会更好吗?

CREATE TABLE tags (
id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
page TEXT NOT NULL, 
tag VARCHAR(255) NOT NULL, 
count INT NOT NULL, 
PRIMARY KEY (id) 
); 

CREATE TABLE tags_2 (
id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
tag_id INT UNSIGNED NOT NULL DEFAULT 0, 
tag VARCHAR(255) NOT NULL, 
count INT NOT NULL, 
PRIMARY KEY (id) 
); 

回答

2

首先,您的模式未规范化。将所有关于标签的数据放在一张表中。将有关页面的数据放在另一个表中。在页面表中,包括引用标记表的主键的外键:

CREATE TABLE pages(
id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
page TEXT NOT NULL, 
tag_id INT UNSIGNED, 
tag_count INT NOT NULL DEFAULT 0, //count is a reserved word 
PRIMARY KEY (id), 
FOREIGN KEY (tag_id) REFERENCES tags(id) 
         ON DELETE RESTRICT 

); 

CREATE TABLE tags (
id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
tag VARCHAR(255) NOT NULL, 
PRIMARY KEY (id) 
); 

然后,在伪代码,您的疑问变成了:如果我

$var= SELECT id FROM tags WHERE tag='somestring'; 
if $var!=0 { 
    UPDATE pages SET tag_id=$var, 
        tag_count=tag_count+1 
    WHERE page_id='a page id'; 
} 
+0

岂不是更好只需检查标签名称是否与第一个表格中的其他标签名称相匹配? – 2009-12-03 03:20:57

+1

需要更长的时间来检查VARCHAR,然后它确实检查INT ...如果您的数据库增长检查每个名称将花费更长,更长的时间返回结果...最好像dnagirl一样实现建议。 – luckykind 2009-12-03 03:31:24

+0

但是当用户提交标签时,我不会不知哪个标签属于哪个标识。我如何解决这个问题。 – 2009-12-03 03:36:11