作者GALINE (天真可爱CQD)
看板PHP
标题Re: [请益] PHP Array
时间Tue Jun 3 01:41:33 2014
※ 引述《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)
);
原文的例子就更明显了,我个人觉得这比全部写在一起更容易阅读...
--
「是大环境要求的~毕竟没有总受就没有故事~╮(╯_╰)╭」
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.27.61.221
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/PHP/M.1401730903.A.858.html
※ 编辑: GALINE (114.27.61.221), 06/03/2014 02:04:54
1F:→ danny8376:虽然改用mysqli/pdo 然後用prepare比escape来得好www 06/03 02:39
2F:→ MOONRAKER:中文属性名没有碰过 但是有碰过数字属性名 06/03 09:48
3F:→ MOONRAKER:写成 $object->{1}->子属性 才能读取 XP 06/03 09:49
4F:→ MOONRAKER:来源应该是从XML或JSON转过来的… 06/03 09:50
5F:→ GALINE:以这个例子连栏位名称都是变数(这也是坏味道...) 06/03 13:59
6F:→ GALINE:prepared statement *好像*没办法处理的样子,不太确定 06/03 13:59
7F:→ Darkland:prepared statement 可以阿. 他就是让你把 query 跟 参数 06/03 21:07
8F:→ Darkland:切开,避免参数被当作语法的一部分,所以只要参数最後是 06/03 21:07
9F:→ Darkland:个值,长的再奇怪都可以. 06/03 21:08
10F:推 orz811017:这篇收益良多 谢谢大大!! 06/05 10:54
11F:→ orz811017:栏位名称用变数 是因为想要尝试用LOOP写好完整的指令 06/05 11:13
12F:→ orz811017:(自己有点懒) 而且其他地方也会用到相同的栏位名称 06/05 11:13
13F:→ orz811017:就想说乾脆全部设为变数比较方便 06/05 11:14