作者ej04cj86 (Swaglicious)
看板PHP
标题Re: [请益] update 资料问题
时间Sun Jul 17 21:04:02 2016
※ 引述《Relent (遗憾)》之铭言:
: 我在php中做更新纪录的动作
: 根据print出来的sql语法如下
: update `tableS` set `history`='[{"time":"2016-07-14
: 18:24:22","count":0,"link":"http://aaa.bbb.cc"}]' where account='110101'
: 只是我的资料表history栏位里面的资料,却变成了这样
: [{"time":"2016-07-14
: 18:24:22","count":0,"link":"http://aaa.bbb.cc"},
: {"time":"2016-07-14
: 18:24:22","count":0,"link":"http://aaa.bbb.cc"},
: {"time":"2016-07-14
: 18:24:22","count":0,"link":"http://aaa.bbb.cc"},
: {"time":"2016-07-14
: 18:24:22","count":0,"link":"http://aaa.bbb.cc"}]
: 多出了3笔同样的纪录
: 想请问一下各位大大这种状况是因为什麽呢
: 程式码如下,
: [code]
: $count=0;
: $bitStr="1101010101111010";
: while($count<30 && strlen($bitStr)>0){
: $percent=0.1;
: $obj=new stdClass();
: $obj->time=$checkDate;
: $obj->count=$count*$percent;
: $obj->link=$url;
: $arr=array();
: array_push($arr,$obj);
: $str=json_encode($arr);
: $sql="update tableS set history='".$str."' where account='".$bitStr."'";
: echo $sql;
: mysql_query($sql);
: $count++;
: $bitStr=substr($bitStr,0,-1);
: }
: [/code]
1. 请爱用PDO的parameters binding, 不然遇到SQL injection...
2. 储存时间最好用timestamp, 不然也期望你是UTC time..否则换server = gg
3. 你如果在php5.5+其实可以直接$str = json_encode([$obj]);
省去
$arr = array();
array_push($arr,$obj);
4. 你的110101010111101 才16个数字, 为什麽要while($count<30)?
$bitStrLength = strlen($bitStr);
for($i = 0, $i <= strlen($bitStrLength), $i++)
5. 照上面的code来看不应该会output3个一样的, 但是我如果是你会这样写
{code:php}
$count = 0;
$percent = 0.1;
$bitStr = "1101010101111010";
$bitStrLength = strlen($bitStr);
for ($i = 0; $i < $bitStrLength; $i++) {
// don't really know why you storing objects into json but whatever
$obj = new stdClass();
$obj->time = $checkDate;
$obj->count = $i * $percent;
$obj->link = $url;
$str = json_encode([$obj]);
$sql = $sql="update tableS set history='".$str."' where account='".$bitStr."'";
echo $sql . "\n";
$bitStr = substr($bitStr, 0, -1);
}
{code}
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 120.156.64.189
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/PHP/M.1468760645.A.6EE.html
1F:→ ej04cj86: 喔还有, xdebug是好物。 不用再echo var_dump了 07/17 21:05
2F:推 Relent: 感谢e大,本来是用pdo的不过写成了function 呼叫,怕问的 07/19 19:10
3F:→ Relent: 不清楚,所以把sql语法的部分简单写了一下 07/19 19:11
4F:→ Relent: <30 是因为其他的状况会有超过30的 07/19 19:12
5F:→ Relent: 本来我以为找到解了 结果IE跑久了也是会出现重复的写入 07/19 19:13
6F:→ ej04cj86: 就你贴的部分应该是不会重复写入的, 不然就$sql = '' 07/20 10:07
7F:→ ej04cj86: 在你loop的最前面. 还有看看pdo->execute()那边有没有 07/20 10:08
8F:→ ej04cj86: 另外的loop 07/20 10:08