PHP表单不会更新我的MySQL数据库

时间:2009-09-21 22:16:12

标签: php mysql

有人可以帮我解决这个代码我搞砸了吗?它不会再更新我的数据库了。

DEFINE('DB_USER', 'root');
DEFINE('DB_PASSWORD', '');
DEFINE('DB_HOST', 'localhost');
DEFINE('DB_NAME', 'tags');

if ($dbc = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD)) { 
    if (!mysql_select_db(DB_NAME)) {            
        trigger_error("Could not select the database!\n<br />MySQL Error: " . mysql_error());
        include('./includes/footer.htm');
        exit();             
    } 
} else { // If it couldn't connect to MySQL.
    trigger_error("Could not connect to MySQL!\n<br />MySQL Error: " . mysql_error());
    include('./includes/footer.htm');
    exit();
} // End of $dbc IF.

$tag = mysql_real_escape_string($_POST['tag']);
$query = 'UPDATE tags SET count = count+1 WHERE tag = '.$tag;
mysql_query($query, $dbc);
if (!mysql_affected_rows()) {
    $query = 'INSERT INTO tags (tag, count) VALUES('.$tag.', 1)';
    if (!mysql_query($query,$dbc)) {
        die('Error: ' . mysql_error());
    }
    echo "1 record added";
}

mysql_close($dbc);

6 个答案:

答案 0 :(得分:6)

假设您在tags.tag上有唯一或主键约束,使用MySQL的ON DUPLICATE KEY功能在一个查询中执行此操作会更简单:

$tag = mysql_real_escape_string($_POST['tag']);
$query = "INSERT INTO tags (tag, count) VALUES ('$tag', 1)
          ON DUPLICATE KEY UPDATE count = count+1";
mysql_query($query, $dbc);

还要注意我对引号做了什么。我在SQL查询字符串周围使用双引号,这允许我直接在字符串中插入PHP变量。无需结束字符串并与“.”或任何内容连接。

然后我在SQL中围绕字符串文字使用单引号。这样做可以使所有内容更具可读性,并帮助您避免忘记在SQL中引用字符串。

PS:在UPDATE之后使用mysql_affected_rows()时你应该知道,即使一行匹配,受影响的行也可以为零,因为如果更新没有对任何值进行净更改,则不会计算作为受影响的行。即试试“UPDATE tags SET count=count;”即使它适用于每个行,它仍会报告零受影响的行。

此提示不适用于您的示例,因为count=count+1必然会更改值。我只是提到它将来使用mysql_affected_rows()

答案 1 :(得分:5)

你应该阅读上一个问题的答案,你仍然缺少sql查询中$ tag周围的引号。

$query = "UPDATE tags SET count = count+1 WHERE tag = '".$tag."'";

$query = "INSERT INTO tags (tag,count) VALUES('".$tag."',1)';

答案 2 :(得分:3)

是的,这条线:

$query = 'UPDATE tags SET count = count+1 WHERE tag = '.$tag;

应如下所示:

$query = "UPDATE tags SET count = count+1 WHERE tag = '".$tag . "'";

冷却。

答案 3 :(得分:2)

我要做的第一件事是删除所有自定义错误处理,以确保它真正连接。要么是这样,要么一起改变查询。此外,更新到mysqli也不会受到伤害。所以首先尝试更改连接:

    DEFINE ('DB_USER', 'root');
    DEFINE ('DB_PASSWORD', '');
    DEFINE ('DB_HOST', 'localhost');
    DEFINE ('DB_NAME', 'tags');

    $dbc = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);

    if ($dbc -> connect_error) {
        echo "Could not select the database!\n MySQL Error: ".$dbc -> connect_error;
        include ('./includes/footer.htm');
        exit(); 
    }

如果您没有收到上述错误,则表示您已连接。然后像这样输入一个虚拟查询:

    $test_query = "SELECT * FROM tags WHERE count = 1";
    $test_results = $dbc->query($test_query);

然后您可以添加一个简单的检查,以便您可以转到真实的查询,例如:

    if($test_results -> num_rows > 0) {        

    $tag = mysql_real_escape_string($_POST['tag']);
    $update_query = "UPDATE tags SET count = count+1 WHERE tag = '$tag'";
    $dbc -> query($update_query);

如果每个查询都存在错误,则抛出错误:

    echo ($dbc -> error) ? $dbc -> error : "";

    if($dbc -> affected_rows < 1 ) {
          $insert_query = "INSERT INTO tags (tag,count) VALUES('$tag',1)";
          $dbc -> query($insert_query);
          echo ($dbc -> error) ? $dbc -> error : "1 record added";
       }
    }

    $dbc -> close();

答案 4 :(得分:0)

$query = "UPDATE tags SET count = count+1 WHERE tag = '".$tag . "'";

这应该被捐赠!

答案 5 :(得分:0)

window.app = {} // d3 stuff - id like to get some server side data in here indow.app.RenderGraph = function (node, width, height) { var nodes , links , canvas , canvasBorder , force , charge = -500 , gravity = 0.17 , linkDist = 70 , nodeRadius = 30 // The function used to build the color // scale used to paint the nodes. , fill = d3.scale.category20(); $(document).ready(function() { var node = $("#canvas").get(0); window.app.RenderGraph(node, 400, 400); });

缩短查询次数