[英]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']
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.