2009-12-03 80 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