PHP:If语句无意中导致多个MySQL列更新?

PHP:If语句无意中导致多个MySQL列更新?,php,mysql,database,if-statement,Php,Mysql,Database,If Statement,我在页面上有一个表格,其中包含: 名为teachername的文本输入框 名为day的文本输入框(格式为YYYY-MM-DD) 一个名为“资源”的选择框,带有选项[Library 1或Library 2] 具有值[1,2,3和4]的选择框命名为block My mysql数据库包含以下字段: -老师 图书馆1Block1 图书馆1区2 图书馆1区3 等等 html页面中的数据被传递到一个php页面,用于将资源和块与正确的mysql字段相匹配,并更新该字段,以便将文本输入框“teacher

我在页面上有一个表格,其中包含:

  • 名为teachername的文本输入框

  • 名为day的文本输入框(格式为YYYY-MM-DD)

  • 一个名为“资源”的选择框,带有选项[Library 1或Library 2]

  • 具有值[1,2,3和4]的选择框命名为block

My mysql数据库包含以下字段: -老师

  • 图书馆1Block1

  • 图书馆1区2

  • 图书馆1区3

  • 等等

html页面中的数据被传递到一个php页面,用于将资源和块与正确的mysql字段相匹配,并更新该字段,以便将文本输入框“teachername”中的数据插入其中

if ($_POST['resource']="Library 1" and $_POST['block']="1")
    {mysql_query(
    "UPDATE Resources
    SET Teacher='yes', Library1block1='$_POST[teachername]'
    WHERE Date='$_POST[day]'");}
if ($_POST['resource']="Library 1" and $_POST['block']="2")
    {mysql_query(
    "UPDATE Resources
    SET Teacher='yes', Library1block2='$_POST[teachername]'
    WHERE Date='$_POST[day]'");}
预期: -在teachername文本输入字段中输入“Mr.Smith”,在选择菜单中选择“Library 1”和“1”,并在名为day的文本输入字段中输入“2012-03-16”

  • 数据被存储并传递给php脚本

  • if语句更新包含与“资源”匹配的字段的数据库记录 字段和“块”字段(library1b1、library1b2等),用于在日期文本字段中输入的日期

  • 该字段将被更新,随后的if语句将检查输入的数据与正确的mysql字段是否匹配

结果: 所有字段(不仅仅是指定的字段)都会根据第一条if语句进行更新

例如:在teachername中输入“Mr.Smith”,选择“Library 1”,在块中选择“1”,在日期中输入“2012-03-16”,不仅会更新Library1block1字段,还会更新Library1block2和library2block1字段

直接输入mysql终端时,mysql语句会正确更新单数字段,但使用此php代码会导致多行更新


请帮助?

您经常犯一个错误,使用赋值运算符(=)而不是相等运算符(=)。在如下所示的行上:

if($_POST['resource']="Library 1")
将其更改为使用比较运算符:

if($_POST['resource'] == "Library 1")

如果语句要比较值,则应在语句中使用两个等号,如下所示:

$_POST['resource']=="Library 1"
这将检查
$\u POST['resource']
是否等于(==)
库1

单个等号将
库1
分配给
$\u POST['resource']

您可以查看以了解更多信息:

编辑:

您还应使用以下值作为用户输入值,例如$\u POST:

if ($_POST['resource'] == "Library 1" and $_POST['block'] == "2")
{
    mysql_query(
    "UPDATE Resources
    SET
        Teacher='yes',
        Library1block1='".mysql_real_escape_string($_POST['teachername'])."'
    WHERE
        Date='".mysql_real_escape_string($_POST['day'])."'"
    );
}

给出答案的人做得很好,但我想补充一个我有时喜欢使用的小技巧(取决于语言等)

通常你会写一个if语句,比如

if ( $var == 1 ) { do_stuff( $var ) }; //or whatever
下面这个简单的小把戏让我几乎不可能犯这个潜在的错误(尤其是在php中)

只需将两者切换。

因此,与往常不同的是:

尽可能尝试以下方法:

我很确定PHP5.2+没有改变到不再工作的地步,但是即使你犯了致命的错误,使用一个等号,它仍然应该工作,因为你不能给常量赋值(数字是常量,对吗?)

我相信这取决于php总是从左到右处理代码的行为:

if ( 1 = $var ) { do_stuff( $var ) }; //or whatever
你是金色的!自从我5年前开始做这件事以来,我再也没有遇到过这个问题。1永远是1,无论你做什么。在php中,这是一种很好的思考条件、循环等的方法


它的美妙之处在于它的头脑中有几分简单。“$var”可以是很多东西,但数字1始终是数字1。我确信这并不适用于所有语言,但对于php,这是我经常使用的一种语言,而且显然以这种方式构造代码是一个好习惯。

a=b
是赋值,
a==b
是检查相等性。旁白:当输出双引号内的数组时,你必须“转义”它,就像
Library1block1=>{$\u POST[teachername]}
Second side point,在数组索引周围不加引号是一种不好的做法:
$\u POST['teachername']
另外,别忘了SQL注入在代码中有很多变化,我以前见过,如果你习惯了,这可能是一个很好的做法。我比较或赋值时更喜欢样式
$var=1
$var==1
。不过,请解释一下+1。
if ( 1 == $var ) { do_stuff( $var ) }; //or whatever
if ( 1 = $var ) { do_stuff( $var ) }; //or whatever