繁体   English   中英

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

[英]PHP: If statements unintentionally causing multiple MySQL columns to update?

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

  • 一个名为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]'");}

预期: - 在“hrhername”文本输入字段中输入“Mr. Smith”,在选择菜单中选择“Library 1”和“1”,并在名为day的文本输入字段中输入“2012-03-16”

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

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

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

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

EX:输入“史密斯先生”为Teachername,选择“库1”,为块选择“1”,输入日期的“2012-03-16”不仅更新Library1block1字段,但它也更新Library1block2和library2block1字段。

mysql语句,当直接输入到mysql终端时,会正确更新单数字段,但是这个php代码的使用会导致多个更新的行。

请帮忙?

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

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

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

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

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

通常你会写一个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,它是我经常使用的一个,而且它显然是一个好习惯无论如何以这种方式构建你的代码。

如果要比较值的语句,你应该使用两个这样的等号

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

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

单个等号将Library 1分配给$_POST['resource']

您可以检查比较操作php.net的详细资料:

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

编辑:

您还应该将mysql_real_escape_string()用于用户输入值,例如$ _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'])."'"
    );
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM