PHP: If语句不小心导致多个MySQL列更新?

3
我有一个页面上的表单,包含以下内容:
  • 一个名为teachername的文本输入框

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

  • 一个名为“resource”的选择框,选项为[Library 1或Library 2]

  • 一个名为block的选择框,值为[1,2,3和4]

我的mysql数据库有以下字段: - 教师
  • Library1block1

  • Library1block2

  • Library1block3

  • 等等。

来自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语句更新包含与“resource”字段和“block”字段(library1b1、library1b2等)匹配的字段的数据库记录,以便为在day文本输入框中输入的日期

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

结果: 根据第一个if语句更新所有字段(而不仅仅是指定的字段)。

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

mysql语句直接在mysql终端中输入时,正确地更新单个字段,但使用此php代码会导致多个已更新的行。

请帮帮忙?


4
a=b 表示赋值,a == b 表示检查是否相等。 - DCoder
旁注:在双引号内输出数组时,您必须“转义”它,就像这样Library1block1 ='{$_POST [teachername]}' - blockhead
第二个要点是,不在数组索引周围加上引号是一种不好的做法:$_POST['teachername'] - blockhead
1
此外,不要忘记在那段代码中存在大量的SQL注入漏洞。 - blockhead
3个回答

3

您犯了一个常见的错误,使用赋值运算符(=)而不是相等运算符(==)。在看起来像这样的行中:

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

将它们更改为使用比较运算符:

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

2

已经回答的人做得很好,但我想添加一个我有时喜欢使用的小技巧(取决于语言等因素)。

通常,你会将if语句写成类似于以下的形式:

if ( $var == 1 ) { do_stuff( $var ) }; //or whatever

这个简单巧妙的技巧让我在使用php时避免了这种潜在错误的发生。

只需要交换两个位置即可。

所以,与其通常的写法:

if ( $var == 1 ) { do_stuff( $var ) }; //or whatever

每当有机会时,请尝试使用以下方法:
if ( 1 == $var ) { do_stuff( $var ) }; //or whatever

我相信 PHP 5.2+ 没有改变到无法使用,即使你犯了一个低级错误使用单等号,它也应该仍然工作,因为你不能给常量赋值(数字是常量值,对吧?)。

我认为这依赖于 PHP 总是从左到右处理代码的行为:

if ( 1 = $var ) { do_stuff( $var ) }; //or whatever

而且你就大功告成了!自从我5年前开始这样做以来,再也没有遇到过这个问题。1永远是1,无论你做什么。这是在php中思考条件语句、循环等的好方法。

其美妙之处在于它的简单易懂。"$var"可以是许多东西,但数字1始终是数字1。我相信这并不适用于所有语言,但对于php来说,这是我经常使用的一种方法,而且显然这是一种良好的习惯,可以使你的代码更加结构化。


1
我以前见过这个,如果你习惯了它,那么这可能是一个好的做法。无论是比较还是赋值,我更喜欢$var = 1$var == 1的风格。不过,感谢你的解释。 - Fabian

0

在编写 if 语句时,应该使用两个等号来进行值比较

$_POST['resource']=="Library 1"

这将检查$_POST['resource']是否等于(==)Library 1

一个等号将Library 1赋值给$_POST['resource']

您可以在php.net上查看比较运算符以获取更多信息:

http://php.net/manual/en/language.operators.comparison.php

编辑:

您应该对用户输入的值,如 $_POST 使用 mysql_real_escape_string():

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'])."'"
    );
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接