佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 1364|回复: 23

要怎样写这个php的statement出来?

[复制链接]
发表于 20-6-2013 05:05 PM | 显示全部楼层 |阅读模式
要怎样写这个的statement出来呢?在MySQL里面没有record就加,如果有和NULL记录就UPDATE NULL记录。但是加之前要检查日期确保不会duplicate这个是我现在的if else statement
  1. if (!empty($theData[0]['0']) || !empty($theData[0]['1']) || !empty($theData[0]['2'])) {
  2.     $sql_m = "INSERT INTO m (date, first, second, third) VALUE(
  3.     '$newDate',
  4.     '" . $theData[0]['0'] . "' ,
  5.     '" . $theData[0]['1'] . "' ,
  6.     '" . $theData[0]['2'] . "')";
复制代码
本帖最后由 just4why 于 20-6-2013 05:12 PM 编辑

回复

使用道具 举报


ADVERTISEMENT

发表于 20-6-2013 06:21 PM | 显示全部楼层
把table里的date设成unique就可以。
回复

使用道具 举报

发表于 21-6-2013 08:42 AM | 显示全部楼层
ON DUPLICATE KEY UPDATE
回复

使用道具 举报

 楼主| 发表于 21-6-2013 09:32 AM | 显示全部楼层
andy5627 发表于 20-6-2013 06:21 PM
把table里的date设成unique就可以。

什么是UNIQUE呢?在table设成还要些什么的code呢?
回复

使用道具 举报

 楼主| 发表于 21-6-2013 10:49 AM | 显示全部楼层
geekman 发表于 21-6-2013 08:42 AM
ON DUPLICATE KEY UPDATE

怎样只是update NULL record呢?
回复

使用道具 举报

发表于 21-6-2013 12:02 PM | 显示全部楼层
just4why 发表于 21-6-2013 10:49 AM
怎样只是update NULL record呢?

你的Row必须设定一个Unique Key。你总不能INSERT一个完全NULL的Record吧?那是很不好的习惯。

Unique Key可以是一个Auto Increment的column,或者任何一个不会重复的column,或者数个column的组合,每个组合都必须是Unique的数值。例如如果你要keep track一个member每年的记录,你可以把 record_year和member_id组合成一个Unique Key,每一年每个member都可以有一个record,但是又不会触发Duplicate Key。

回复

使用道具 举报

Follow Us
 楼主| 发表于 21-6-2013 12:14 PM | 显示全部楼层
geekman 发表于 21-6-2013 12:02 PM
你的Row必须设定一个Unique Key。你总不能INSERT一个完全NULL的Record吧?那是很不好的习惯。

Unique  ...

如果我有5个records但是1一个和第3个是NULL,那我要怎样UPDATE 1和3呢?我就不想真个row update
  1. ON DUPLICATE KEY UPDATE
  2. a_first = '" . $theData[0]['0'] ."' ,
  3. a_second = '" . $theData[0]['1'] ."'";
复制代码
回复

使用道具 举报

发表于 21-6-2013 12:28 PM | 显示全部楼层
你要弄清楚,在SQL里面一般上Row指的就是一个record,而每个Record的各个项目,都被称为Column,或者Field(ODBC 的 user 会比较习惯 Field 这个名称)。

如果你要check的是某个Row里面的某个Column是NULL那你可以使用这个方法:

  1. /// $result = result of query
  2. $row = mysqli_fetch_array($result);
  3. if($row[column_1] == NULL)
  4. {
  5.     /// do update 1
  6. }
  7. if($row[column_2] == NULL)
  8. {
  9.     /// do update 2
  10. }
  11. ...
  12. if($row[column_n] == NULL)
  13. {
  14.     /// do update N
  15. }
复制代码
本帖最后由 geekman 于 21-6-2013 12:36 PM 编辑

回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 21-6-2013 12:32 PM | 显示全部楼层
geekman 发表于 21-6-2013 12:28 PM
你要弄清楚,在SQL里面一般上Row指的就是一个record,而每个Record的各个项目,都被称为Column,或者Field( ...

如果我有20个colum那不是要做很多if else?
回复

使用道具 举报

发表于 21-6-2013 12:34 PM | 显示全部楼层
如果是PHP的方式,是的。如果你要的是SQL Statement,可以参考这个:http://thewebfellas.com/blog/201 ... -updates-with-mysql,基本上还是有多少Column就要多少IF()。
本帖最后由 geekman 于 21-6-2013 12:42 PM 编辑

回复

使用道具 举报

 楼主| 发表于 21-6-2013 12:44 PM | 显示全部楼层
geekman 发表于 21-6-2013 12:34 PM
如果是PHP的方式,是的。如果你要的是SQL Statement,可以参考这个:http://thewebfellas.com/blog/2010/1/ ...

那我这个sql query要怎样加才可以呢?刚才试了你给的demo还是不行
  1. if (!empty($my[0]['0']) || !empty($my[0]['1']) || !empty($my[0]['2'])) {
  2.     $sql_m = "INSERT INTO m (abc_date, abc_first, abc_second, abc_third, abc_kl_1, abc_kl_2, abc_kl_3, abc_kl_4, abc_kl_5, abc_kl_6, abc_kl_7, abc_kl_8, abc_kl_9, abc_kl_10, abc_pg_1, abc_pg_2, abc_pg_3, abc_pg_4, abc_pg_5) VALUE(
  3.     '$newDate',
  4.     '" . $my[0]['0'] . "' , '" . $my[0]['1'] . "' , '" . $my[0]['2'] . "' ,
  5.     '" . $my[0]['3'] . "' , '" . $my[0]['4'] . "' , '" . $my[0]['5'] . "' ,
  6.     '" . $my[0]['6'] . "' , '" . $my[0]['7'] . "' , '" . $my[0]['8'] . "' ,
  7.     '" . $my[0]['9'] . "' , '" . $my[0]['10'] . "' , '" . $my[0]['11'] . "' ,   
  8.     '" . $my[0]['12'] . "' , '" . $my[0]['13'] . "')
  9.     ON DUPLICATE KEY UPDATE
  10.     abc_first = '" . $my[0]['0'] . "' , abc_second = '" . $my[0]['1'] . "' , abc_third = '" . $my[0]['2'] . "' ,
  11.     abc_kl_1 = '" . $my[0]['3'] . "' , abc_kl_2 = '" . $my[0]['4'] . "' , abc_kl_3 = '" . $my[0]['5'] . "' ,
  12.     abc_kl_4 = '" . $my[0]['6'] . "' , abc_kl_5 = '" . $my[0]['7'] . "' , abc_kl_6 = '" . $my[0]['8'] . "' ,
  13.     abc_kl_7 = '" . $my[0]['9'] . "' , abc_kl_8 = '" . $my[0]['10'] . "' , abc_kl_9 = '" . $my[0]['11'] . "' ,
  14.     abc_kl_10 = '" . $my[0]['12'] . "' , abc_pg_1 = '" . $my[0]['13'] . "' , abc_pg_2 = '" . $my[0]['14'] . "' ,
  15.     abc_pg_3 = '" . $my[0]['15'] . "' , abc_pg_4 = '" . $my[0]['16'] . "' , abc_pg_5 = '" .";
  16.     mysql_query($sql_m) or die("Fatal error: " . mysql_error());
  17. }
复制代码
回复

使用道具 举报

发表于 21-6-2013 01:04 PM | 显示全部楼层
如果你觉得ON DUPLICATE KEY UPDATE 有点难理解,我个人是建议自行检测:
注意我用的是 mysqli_ , 不是 mysql_ 。mysql_ 已经是被淘汰的旧Function了。

  1. $query = "SELECT * FROM m WHERE abc_date = " . $date;
  2. $result = mysqli_query($con, $query) or die(mysqli_error($con));
  3. if(mysqli_num_rows($result) < 1) /// No record exists
  4. {
  5.     //// Insert record as usual
  6.     $query = "INSERT INTO m ...blah blah blah...";
  7. }
  8. else /// record exists
  9. {
  10.     $row = mysqli_fetch_array($result);
  11.     /// check columns value, update if it is NULL, don't update if not NULL
  12.     $query = "UPDATE m SET(abc_date = " . $row['abc_date'] . ",";
  13.     if($row['abc_first'] == NULL)
  14.     {
  15.         $query .= "abc_first = '" . new_value . "',";
  16.     }
  17.     ....
  18.     $query .= " WHERE abc_date = " . $date . ";";
  19. }
  20. mysqli_query($con, $query) or die(mysqli_error($con));
复制代码
本帖最后由 geekman 于 21-6-2013 01:08 PM 编辑

回复

使用道具 举报

 楼主| 发表于 21-6-2013 03:04 PM | 显示全部楼层
geekman 发表于 21-6-2013 01:04 PM
如果你觉得ON DUPLICATE KEY UPDATE 有点难理解,我个人是建议自行检测:
注意我用的是 mysqli_ , 不是 m ...

如果在ON DUPLICATE KEY UPDATE要怎样做呢?下面if 的statement是拿来做validation,就是当1 2 3的东西在他就输入record。输入了record再检查那个column是null的。刚才你的code也是不能update null,为什么呢 Fatal error: Duplicate entry '2013-06-16' for key 'm_date'
  1. if (!empty($my[0]['0']) || !empty($my[0]['1']) || !empty($my[0]['2'])) {

  2. .........

  3. };
复制代码
本帖最后由 just4why 于 21-6-2013 03:38 PM 编辑

回复

使用道具 举报

发表于 21-6-2013 04:17 PM | 显示全部楼层
我不明白你说的不能Updagte NULL是什么意思。

有时Empty Filed并不一定是NULL,也可以是Empty String(For String type column),也就是“”,所以你也要Check这个可能性,还有,Numeric column也不能Check  against NULL,因为NULL就是0,如果那个column的内容正好是0,也会出现问题。

Duplicate entry '2013-06-16' for key 'm_date' 是因为你把m_date设定为UNIQUE,而你尝试再INSERT一个相同的日期。
回复

使用道具 举报

发表于 21-6-2013 06:12 PM | 显示全部楼层
$query = "SELECT * FROM m WHERE abc_date = " . $date;
你查一查是date format 的問題嗎.
回复

使用道具 举报

 楼主| 发表于 24-6-2013 12:16 PM | 显示全部楼层
yan13 发表于 21-6-2013 06:12 PM
$query = "SELECT * FROM m WHERE abc_date = " . $date;
你查一查是date format 的問題嗎.

拿到的info是 SELECT * FROM m where abc_date =2013-06-23
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 24-6-2013 12:19 PM | 显示全部楼层
geekman 发表于 21-6-2013 04:17 PM
我不明白你说的不能Updagte NULL是什么意思。

有时Empty Filed并不一定是NULL,也可以是Empty String(F ...

现在就是UPDATE了之后,就检查有NULL record,如果有就update null record,如果不能update 就skip。之后我会做一个cron job来run他
回复

使用道具 举报

发表于 24-6-2013 01:41 PM | 显示全部楼层
Fatal error: Duplicate entry '2013-06-16' for key 'm_date'
你是run了那一段code出的error?現在還有嗎?
回复

使用道具 举报

 楼主| 发表于 24-6-2013 01:49 PM | 显示全部楼层
yan13 发表于 24-6-2013 01:41 PM
Fatal error: Duplicate entry '2013-06-16' for key 'm_date'
你是run了那一段code出的error?現在還有嗎? ...

因为我使用Unique key所以有duplicate的资料就会出现
回复

使用道具 举报

发表于 24-6-2013 02:04 PM | 显示全部楼层
if(mysqli_num_rows($result) < 1) /// No record exists
geekman給你的例子有checking的,如果record存在就update,沒的話才insert.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 15-11-2025 03:03 AM , Processed in 0.138482 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表