佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 1832|回复: 22

想问关于一下 PHP 收资料的问题

[复制链接]
发表于 13-3-2015 09:50 PM | 显示全部楼层 |阅读模式
我做了一个system,好像e-maid system那样,然后那些user会给maid的feedback,在每一个user feedback玩后都会直接显示出来包括username,像这样一直feedback又要一直show出来的,要怎样把这样多的资料store起来,用database好还是用textfile?有那位大大有经验帮帮小弟,给些意见,谢谢
因为database好像是一个column可以收一个资料而已对吗?
回复

使用道具 举报


ADVERTISEMENT

发表于 17-3-2015 02:40 PM | 显示全部楼层
你好!

你知道为什你POST的东西将近4天了, 还没有回应吗?

1)  你要讲清楚什么是 e-maid,  有范例吗?

2) 不管是用任何语言, 凡是牵涉到储存"文字"的, 都是用DB比较好, 原因:
   a)你不用去管 one writer many reader的问题, 也就是 lock的问题
   b)也不许要去管, 资料变大后, load 很慢的问题
   c)更不许要去理, 你的file变多后, HD 会出现fragment的问题.

如果你坚持要用File不是不可以, 你就好像原始人那样, 要大号的时候挖一个洞, 挖的同时你要担心怕挖的不够深,  会有东西跑出来,
挖太深, 又太危险怕跌下去.

而用DB就好像用流动厕所那样, 他还是会有问题,但是出来的问题比你挖地洞发现的问题高级多了.

Good good study, day day up.
回复

使用道具 举报

 楼主| 发表于 17-3-2015 05:00 PM | 显示全部楼层
musicalangel 发表于 17-3-2015 02:40 PM
你好!

你知道为什你POST的东西将近4天了, 还没有回应吗?

可能我的用词错了吧,我做的网站这个目的是让要找maid的人或者是想做maid(或钟点)提供一个平台那样,让maid上网填自己的资料,member可以search和booking,之后会留下feedback之类,我想用db来收那个feedback,可是feedback一直有,我要怎样insert进去那个database的table里面?database里的table每一个column不是只可以进一个value而已吗?

如果我有哪里说错了,不好意思,我不是很懂database这个东西,谢谢大大的回复,目前我是用着textfile来收feedback
回复

使用道具 举报

发表于 18-3-2015 08:34 AM | 显示全部楼层
本帖最后由 musicalangel 于 18-3-2015 08:38 AM 编辑
shern91 发表于 17-3-2015 05:00 PM
可能我的用词错了吧,我做的网站这个目的是让要找maid的人或者是想做maid(或钟点)提供一个平台那样,让 ...

早上好

这样的描述就好多了.

这问题可以归类成Data Model 或 Normalization 的方向去思考:

例如原本你的ERD看似这样子

  1. User 1---N Booking N---1 Maid
复制代码
然后Booking 里面的Schema应该像这样
  1. id
  2. user_id
  3. maid_id
  4. book_date
  5. book_start_time
  6. book_end_time
  7. feedback1
  8. feedback2
  9. feedback3
  10. ...
复制代码
当然DB设计里面没有人这样设计的, 因为
  • 每个Table的column有一定的上限值, 例如 MYSQL好像只能够256个Column而已
  • 如果这样子设计, 会浪费很多空间, 例如之用到feedback1, 其他的column都是NULL, 累计5M 的booking记录, 就浪费了很多地方
  • 会有效能跟编写query的困难等问题

那要怎样设计?

方案一:
建立一个feedback的table, 然后与booking 成1对N的关系, 如下图所示
  1. User 1---N Booking N---1 Maid
  2.                         
  3. Booking 1---N Feedback
复制代码

如果还是不太明白, 你就想象成 forum的 thread 跟 post
就是我开一个主题, 主题的内容, 标题, 日期都是记录在thread 里面
然后 其他人回post都是记录在 post里面, 然后 post有一个thread_id, 对到哪一个thread的

方案二:

直接设计成message的功能, 就是:
  1. User --- Booking --- Maid

  2. User --- Message --- Maid
复制代码

如果还是不懂, 在联络,

祝GBY, coding 永无bug.


评分

参与人数 1人气 +5 收起 理由
hui_wooi + 5 经常看见这位童鞋细心教导网友,值得加分。

查看全部评分

回复

使用道具 举报

发表于 19-3-2015 01:15 PM | 显示全部楼层
如楼上所说的  database 其实会 更加的好 管理 而且  一个 table 是可以有 很多field 的
主要还是看你如何设计你的 database structure
但是如果你使用 text file 的话  恭喜你  很快你的 system 就可以用 蜗牛的 速度 来 retrieve data
而且更加的 容易 clash  
回复

使用道具 举报

 楼主| 发表于 19-3-2015 10:08 PM | 显示全部楼层
kelvinv84 发表于 19-3-2015 01:15 PM
如楼上所说的  database 其实会 更加的好 管理 而且  一个 table 是可以有 很多field 的
主要还是看你如 ...

所以每当一个新的feedback我就要create一个新的field,比如,feedback(table_name),里面有username,feedback1,feedback2,当收到第三个feedback,自动create第三个feedback的field?
回复

使用道具 举报

Follow Us
 楼主| 发表于 19-3-2015 10:13 PM | 显示全部楼层
musicalangel 发表于 18-3-2015 08:34 AM
早上好

这样的描述就好多了.

谢谢大大的回复,我还在仔细的看大大跟我解释的东西,目前我有一个table是收maid的全部details,包括username & password,所以是要做多一个table收booking和feedback的?

然后 其他人回post都是记录在 post里面, 然后 post有一个thread_id, 对到哪一个thread的


关于这个我还是不是很明白,论坛是一个页大概有20楼(可以写20个回复的意思),这些资料都是收在database还是有另外的办法?


回复

使用道具 举报

发表于 19-3-2015 10:50 PM | 显示全部楼层
本帖最后由 musicalangel 于 19-3-2015 10:51 PM 编辑
shern91 发表于 19-3-2015 10:13 PM
谢谢大大的回复,我还在仔细的看大大跟我解释的东西,目前我有一个table是收maid的全部details,包括user ...

晚上好, 快到我的睡觉时间了, 所以我长话短说

每页限制20楼其实是没有限制的, 只是discuz写的时候是这样预设而已.

OK, 既然讲了forum会让你confuse 跟误解, 我直接解题

答案:

4个table

//使用者的细节
user:
  • uid (PK)
  • username
  • password
  • ic
  • tel
  • email
  • birthday
  • type_id (FK)
  • ...

//使用者的种类
type:
  • id (PK)
  • chinese_name (使用者, 钟点, 管理者)
  • english_name (user, maid, admin)
  • ...

//预定时间
booking:
  • id (PK)
  • user_id (FK)
  • maid_id (FK)
  • start_date
  • end_date
  • start_time
  • end_time
  • ...

//钟点的feedback
feedback:
  • id (PK)
  • booking_id (FK)
  • maid_id (FK)
  • text
  • date
  • time
  • ...

注意: PK 为 primary key, FK 为 Foreign Key

以下为ERD 图
Fast_Draw01.jpg

回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 19-3-2015 11:14 PM | 显示全部楼层
musicalangel 发表于 19-3-2015 10:50 PM
晚上好, 快到我的睡觉时间了, 所以我长话短说

每页限制20楼其实是没有限制的, 只是discuz写的时候是这 ...

晚上好,谢谢大大解释得那么详细的还放图上来,我会去仔细研究和实践一下大大所跟我解释的东西.

现在才发觉懂的东西太少
回复

使用道具 举报

发表于 20-3-2015 12:08 AM | 显示全部楼层
就是feedback收在另一個table, 用id來連結


當然畫出來就很清楚了
回复

使用道具 举报

 楼主| 发表于 21-3-2015 04:41 PM | 显示全部楼层
alejandro 发表于 20-3-2015 12:08 AM
就是feedback收在另一個table, 用id來連結

id自己create的?谢谢大大的回复
回复

使用道具 举报

 楼主| 发表于 21-3-2015 05:03 PM | 显示全部楼层
musicalangel 发表于 19-3-2015 10:50 PM
晚上好, 快到我的睡觉时间了, 所以我长话短说

每页限制20楼其实是没有限制的, 只是discuz写的时候是这 ...

午安,想问大大一些问题

现在我做了一个booking table(如下图,booking_id可能会用Auto increase),我的booking time 分成3个slot,(book_1)8.00 AM - 12.00 PM(book_2)1.00 PM - 5.00 PM(book_3)6.00 PM - 10.00 PM
我是用true false的value来判定那个slot是否给人booking了

booktable.jpg

我的问题是,比如 user_A book了maid_A 的book_1的时间,日期是今天,然后 user_b也要book maid_A 今天的book_1的时间,我要怎样去判断那个时间给人book了,还要根据日期来做if else statement,谢谢指导
回复

使用道具 举报

发表于 21-3-2015 11:20 PM | 显示全部楼层
我先解惑你的问题, 我们先不谈资料库设计

如果要调查某个maid 是否在某天的某个时段被booking了, 直接用SQL语法去select 就可以了
例如:

  1. select  count(*) as num from booking
  2. where maid_id = ".$maid_id." and
  3. book_date= ".$book_date." and
  4. book_1 is not null
复制代码


这时你select 出来的东西只会有一个field, 叫做num, 用php 把他fetch 出来, 判断他如果大于0,
表示 "大婶A" 在 "某一天" "某个时段" 被人预订了
code 会看起来像这样子:

  1. $result=mysql_query($sql);

  2. //判断mysql_query是否有顺利执行
  3. if(is_resource($result))
  4. {
  5.   //从mysql result 里面拿出那个号码
  6.   list($num)=mysql_fetch_array($result);
  7.   
  8.   //如果大于0
  9.   if($num>0)
  10.   {
  11.       echo "已经被预订, 请选择其它时间";
  12.   }
  13. }
复制代码


回复

使用道具 举报

发表于 21-3-2015 11:36 PM | 显示全部楼层
本帖最后由 musicalangel 于 21-3-2015 11:51 PM 编辑

OK, 这个post 我们讨论你的设计

对于时段, 我个人建议你可以有两种做法

做法1:
在你的php里面, 设定一个阵列:

  1. $book_time_list=array(
  2.    "1"=>"8.00 AM - 12.00 PM",
  3.    "2"=>"1.00 PM - 5.00 PM",
  4.    "3"=>"6.00 PM - 10.00 PM"
  5. );
复制代码


然后在你的booking 的table 里面
book_1, book_2, book_3 删掉, 改成book_time, 记录1 或 2 或 3

你会问, 为什么?

这样一来, 你就能够用刚才设定的array, 做不同用途,
1) 下来选单的选项
2) 产生报表时, output 只要一个简单的写法, 就可以转成时间

  1. <table>
  2.    <tr>
  3.        <td>
  4.              <?=$book_time_list[$book_time]?>
  5.        </td>
  6.    </tr>
  7. </table>
  8. PS:$book_time 是从DB select 出来的值
复制代码


3) 作为以后如果你要增加时段, 只须改这个阵列, 而不需修改table 的schema.

做法2:
改成 2个field, 一个为起始时间(start_time), 另外一个为(hour)

这样你的客人就可以单单定一个小时就好, 或者定足8个小时(弹性)

至于怎样避免重复, 那更简单了
mysql 有一个function 叫 addtime
范例如下:
  1. select count(*) as num from booking
  2. where maid_id=".$maid_id." and
  3. book_time <= "$start_time" and
  4. add_time(book_time, sec_to_time(hour*60*60)) >= ".$start_time."
复制代码

意思就是说, 如果新来的客人选择的时间介于某个开始的时间跟结束的时间(book_time+hour), 就满足select  的条件,

如果你人是在马六甲, 可以考虑来我公司做, 我慢慢教你.
回复

使用道具 举报

 楼主| 发表于 22-3-2015 10:29 AM | 显示全部楼层
musicalangel 发表于 21-3-2015 11:36 PM
OK, 这个post 我们讨论你的设计

对于时段, 我个人建议你可以有两种做法

早安,谢谢大大的指导,我学到了很多新的东西,可惜我不是住在马六甲 可是目前在雪兰莪求学,谢谢大大那么细心的指导,其实对于SQL我算是新手,以前在lab老师教课就是给一个完整的code我们照写,然后要我们去明白那个code,都是普通的select insert,很多code都是cnp,不过做这个project后就那些code明白了很多. 那个array的也是我想不到的东西 我尝试做看,万分感激.
回复

使用道具 举报

 楼主| 发表于 22-3-2015 02:04 PM | 显示全部楼层
本帖最后由 shern91 于 22-3-2015 02:09 PM 编辑
musicalangel 发表于 21-3-2015 11:36 PM
OK, 这个post 我们讨论你的设计

对于时段, 我个人建议你可以有两种做法

其实我要怎样拿到1或2或3这个value呢?

因为我试echo value出来
  1. <?php
  2. $book_time_list=array(
  3.    "1"=>"8.00 AM - 12.00 PM",
  4.    "2"=>"1.00 PM - 5.00 PM",
  5.    "3"=>"6.00 PM - 10.00 PM"
  6. );

  7. ?>
  8. <form method="POST">
  9.         <input type="checkbox" class="option" name="time[]" value="<?= $book_time_list[1]?>" > 8.00 AM - 12.00 PM <br>
  10.     <input type="checkbox" class="option" name="time[]" value="<?= $book_time_list[2]?>" > 1.00 PM - 5.00 PM <br>
  11.     <input type="checkbox" class="option" name="time[]" value="<?= $book_time_list[3]?>" > 6.00 PM - 10.00 PM</td>
  12.         <br>
  13.         <input type="submit" value="Submit" name="submit">
  14. </form>
  15. <?php
  16. if(isset($_POST['submit'])){
  17. if(!empty($_POST['time'])){
  18. foreach($_POST['time'] $selected){
  19. echo $selected."</br>";
  20. }
  21. }
  22. }
  23. ?>
复制代码

output.jpg
可是我得到的output是时间,而不是1,2,3.还有一个问题是=>,这个operator其实我不是很明白,我是google了一下,它的功能是不是好像一个array里面,拿着两个不同的value?
回复

使用道具 举报


ADVERTISEMENT

发表于 22-3-2015 02:17 PM | 显示全部楼层
似乎你很多基础没搞懂, 就算毕业出来, 也会很危险, 你要注意一下

我先回答你第二个问题,


  1. $book_time_list=array(
  2.    "1"=>"8.00 AM - 12.00 PM",
  3.    "2"=>"1.00 PM - 5.00 PM",
  4.    "3"=>"6.00 PM - 10.00 PM"
  5. );
复制代码


这个code 就是宣告一个 1X3的阵列
然后 1, 2, 3 是 key 值, 8.00 AM - 12.00 PM是内容

在一般比较符号, => 是可以作为小于等于
但是在array 里面是作为 key 值 对应 value 值的符号

所以你在你的code 里面打

  1. $book_time_list[1]
复制代码


意思就是 $book_time_list 里面的第一个 value

所以他会出现 8.00 AM - 12.00 PM是正确的,
只是你搞糊涂了.
回复

使用道具 举报

 楼主| 发表于 22-3-2015 02:35 PM | 显示全部楼层
本帖最后由 shern91 于 22-3-2015 02:39 PM 编辑
musicalangel 发表于 22-3-2015 02:17 PM
似乎你很多基础没搞懂, 就算毕业出来, 也会很危险, 你要注意一下

我先回答你第二个问题,

嗯,好的,明白了,一直麻烦大大不好意思了,可能我会将booking时间换成好像start time & end time. 这样可能也比较flexible和容易做比较

因为一开始大大建议我 记录1 或 2 或 3” 让我误会了是拿来记录时间的slot 1,2,3   =》这个符号我以前没有用过的 》=这个就有 ,哈哈
回复

使用道具 举报

发表于 23-3-2015 06:42 PM | 显示全部楼层
shern91 发表于 22-3-2015 02:35 PM
嗯,好的,明白了,一直麻烦大大不好意思了,可能我会将booking时间换成好像start time & end time. 这样 ...

如果我会嫌提供帮忙是很麻烦的话, 最初我就不会回答任何问题了,

在这边提供你最后的建议

start_time 跟 end_time 在判断重复的时候, 也是会很麻烦的
假设新的booking 是 new_start 跟 new_end
在 执行sql的时候大致上会需要兼顾几个情况

1) start_time <= new_start <= end_time
2) start_time <= new_end <= end_time
3)(new_start < start_time  && end_time <new_end)

至于为什么, 就留给你自己参考好了.

同时在输入的时候, 就要预先判定 new_start !>= new_end, 预防你起始时间跟结束时间颠倒, 之后计钟点算价钱的时候一定出错.

如果还是有问题, 请开个新的thread.

祝课业进步, 共勉之.



回复

使用道具 举报

 楼主| 发表于 23-3-2015 08:02 PM | 显示全部楼层
musicalangel 发表于 23-3-2015 06:42 PM
如果我会嫌提供帮忙是很麻烦的话, 最初我就不会回答任何问题了,

在这边提供你最后的建议

好的,谢谢大大,如果booking做到,我最后一个要做的应该就是GPS了,不知道能不能做到,无意中看到apple的网址的GPS做是用current location来找最靠近或者靠近的repair service center,想大概做那样的,会在booking成功后尝试看  
回复

使用道具 举报

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

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


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

GMT+8, 20-4-2024 01:57 PM , Processed in 0.077606 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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