Re: [请益] PHP Array

楼主: GALINE (天真可爱CQD)   2014-06-03 01:41:33
※ 引述《orz811017 (orz811017)》之铭言:
: http://ppt.cc/OtRM
: 这图中为什么 前者的 valeue->row[0] 会错误
: Catchable fatal error: Object of class stdClass could not be converted to
: string
以这个例子来说,PHP 认定成
"$value->$row[0]"
一个 两个
而不是
"$value->$row[0]"
一个变量
但是 $value 是没办法转换成字串的物件,所以 PHP 就生气了。 
这个切字串的判断也是很合理的
如果今天写 code 的人真的要输出“XXX->OOO”这个字串,应该也会写成这样...
这部份的处理方法就如同上面推文,改成 "{$value->$row[0]}" 就可以解决了
这样 PHP 才知道正确的断点在哪里
然后针对这段 code 提出一点其他的建议
1. 资料字段名称尽量不要用中文,偶而会发生灵异现象,像是
http://twpug.net/x/modules/newbb/viewtopic.php?topic_id=2328
http://www.dotblogs.com.tw/bruce655/archive/2012/05/30/72480.aspx
虽然没碰到问题的话就没问题...
2. 任何变量喂进 SQL 之前都要作过 Escape,例如
"SELECT * FROM `company` WHERE name = '{$name}'"
  如果今天要查白兰氏而输入了“Brand's”,那就会组合成
"SELECT * FROM `company` WHERE name = 'Brand's'"
^^^ 这个地方会有 SQL 错误
如果你用 mysql_query() 来查资料,那么正确的作法是用
mysql_real_escape_string() 把输入值洗过一次,例如
"SELECT * FROM `company` WHERE name = '".mysql_real_escape_string($name)."'"
组出来的 SQL 会是
"SELECT * FROM `company` WHERE name = 'Brand\'s'"
^^ 这个单引号被跳脱掉了
可能有人说用 addslashes() 可以作类似的事情,但是不要这么用[汗]
用 mysql_query() 来下 SQL 的时候,你只应该用 mysql_real_escape_string()
没有其他选择
3. 请爱用 sprintf(),尤其是你想要作 2. 的时候。例如可以把 2. 的 SQL 改写成
$sql = sprintf(
"SELECT * FROM `company` WHERE name = '%s'",
mysql_real_escape_string($name)
);
或者更长一点的例子
$sql = sprintf(
"SELECT * FROM `company` WHERE name='%s' AND type='%s' AND address='%s'",
mysql_real_escape_string($name),
mysql_real_escape_string($type),
mysql_real_escape_string($address)
);
原文的例子就更明显了,我个人觉得这比全部写在一起更容易阅读...
作者: danny8376 (钓到一只猴子@_@)   2014-06-03 02:39:00
虽然改用mysqli/pdo 然后用prepare比escape来得好www
作者: MOONRAKER (㊣牛鹤鳗毛人)   2014-06-03 09:48:00
中文属性名没有碰过 但是有碰过数字属性名写成 $object->{1}->子属性 才能读取 XP来源应该是从XML或JSON转过来的…
楼主: GALINE (天真可爱CQD)   2014-06-03 13:59:00
以这个例子连字段名称都是变量(这也是坏味道...)prepared statement *好像*没办法处理的样子,不太确定
作者: Darkland (小黑XDrz)   2014-06-03 21:07:00
prepared statement 可以阿. 他就是让你把 query 跟 参数切开,避免参数被当作语法的一部分,所以只要参数最后是个值,长的再奇怪都可以.
作者: orz811017 (orz811017)   2014-06-05 10:54:00
这篇收益良多 谢谢大大!!字段名称用变量 是因为想要尝试用LOOP写好完整的指令(自己有点懒) 而且其他地方也会用到相同的字段名称就想说干脆全部设为变量比较方便

Links booklink

Contact Us: admin [ a t ] ucptt.com