我有这个PHP代码,应该检查一个单词是否已经在数据库中。如果是,它只是添加一个单词被选择的次数。如果它不在数据库中,则会添加它。我遇到的问题是它没有更新我的数据库。我已经证实一切都正常连接,它甚至回应了所选择的单词。它只是不会更新。我的代码如下:
<?php
include 'swearTrackDB.php';
$conn = mysql_connect($host,$user,$pass) or die ('could not connect');
$dbs = mysql_select_db($databaseName, $conn) or die ('could not reach database');
if(isset($_POST['mash'])) {
$mash = $_POST['mash'];
$query = mysql_query("SELECT * FROM tracker1 WHERE string='$mash'");
if(mysql_num_rows($query) > 0) {
$sql = "UPDATE tracker1 SET count = count + 1 WHERE string = $mash";
}else{
$sql = "INSERT INTO tracker1 ('string') VALUES ('$mash')";
}
}
?>
请帮忙!我无法弄清楚这一点,我一直在寻找几个小时!
提前致谢
即使我的代码显着更新,这也没有给我任何错误,但它仍然没有发布到数据库。那里的任何人还是愿意帮助我解决我的愚蠢问题吗?
<?php
include 'swearTrackDB.php';
$conn = mysql_connect($host,$user,$pass) or die ('could not connect');
$dbs = mysql_select_db($databaseName, $conn) or die ('could not reach database');
if(isset($_POST['mash'])) {
$mash = $_POST['mash'];
$query = mysql_query("SELECT * FROM tracker1 WHERE string='$mash'");
if(mysql_num_rows($query) > 0) {
$updatequery = mysql_query("UPDATE tracker1 SET count = count + 1 WHERE string = $mash");
mysql_select_db('tracker1');
$sql = mysql_query( $sql, $conn );
if(! $retval )
{
die('Could not update data: ' . mysql_error());
}
echo "Updated data successfully\n";
mysql_close($conn);
}else{
$sql = mysql_query("INSERT INTO tracker1 ('string', 'count', 'upvote', 'downvote') VALUES ('$mash', '1', '0', '0')");
mysql_select_db('tracker1');
$retval = mysql_query( $sql, $conn );
if(! $retval )
{
die('Could not update data: ' . mysql_error());
}
echo "Updated data successfully\n";
mysql_close($conn);
}
}
?>
答案 0 :(得分:3)
在您的第一个代码实例中,我可以看到您执行select
查询的位置,但更新和插入不会因为将它们放入字符串变量而神奇地执行: - )
你也需要在这些问题上致电mysql_query
。
但是,无论如何,除了严格的单用户环境之外,这是一个可怕的想法,因为你有竞争条件。在select
和insert/update
之间,某人 else 可能会进入并更改您下方的数据库。
我怀疑更好的选择是使用MySQL的insert ... on duplicate key update ...
功能,如文档here所述:
insert into tracker1 (`string`) values ('$mash')
on duplicate key update `count` = `count` + 1
还请注意列名称上的反引号,而不是单引号,您可能希望(在某些时候)查找sql injection
或little bobby tables
以查看为什么在您的查询中盲目使用未经过清除的$mesh
在除米老鼠(a)应用程序之外的任何其他方面都是危险的。
如果您在查询中使用'
,请更深入地了解引号:
create table xyzzy (a int);
insert into xyzzy ('a') values (1);
你会看到以下内容:
You have an error in your SQL syntax;
Check the manual that corresponds to your MySQL server
version for the right syntax to use near:
"'a') values (1)" at line 1: insert into xyzzy ('a') values (1)
列名称可以被反引号包围,以保护它们不受SQL解析器的影响,但不是引号。之前的查询必须写为:
create table xyzzy (a int);
insert into xyzzy (`a`) values (1);
(a)米老鼠是华特迪士尼公司的注册商标,但我更倾向于使用俚语“不重要,琐碎”。提前向迪士尼道歉,我不希望不必要地削弱您的商标,但是,如果您对我的使用有疑问,您可能想要使用美国传统词典: - )
答案 1 :(得分:1)
替换此代码行
$sql = "UPDATE tracker1 SET count = count + 1 WHERE string = $mash";
使用:
$updatequery = mysql_query("UPDATE tracker1 SET count = count + 1 WHERE string = $mash");
这一行:
$sql = "INSERT INTO tracker1 ('string') VALUES ('$mash')";
使用:
$insertquery = mysql_query("INSERT INTO tracker1 ('string') VALUES ('$mash')");