查看: 1832|回复: 22
|
想问关于一下 PHP 收资料的问题
[复制链接]
|
|
我做了一个system,好像e-maid system那样,然后那些user会给maid的feedback,在每一个user feedback玩后都会直接显示出来包括username,像这样一直feedback又要一直show出来的,要怎样把这样多的资料store起来,用database好还是用textfile?有那位大大有经验帮帮小弟,给些意见,谢谢
因为database好像是一个column可以收一个资料而已对吗?
|
|
|
|
|
|
|
|
发表于 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
|
显示全部楼层
可能我的用词错了吧,我做的网站这个目的是让要找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 编辑
早上好
这样的描述就好多了.
这问题可以归类成Data Model 或 Normalization 的方向去思考:
例如原本你的ERD看似这样子
- User 1---N Booking N---1 Maid
复制代码 然后Booking 里面的Schema应该像这样
- id
- user_id
- maid_id
- book_date
- book_start_time
- book_end_time
- feedback1
- feedback2
- feedback3
- ...
复制代码 当然DB设计里面没有人这样设计的, 因为
- 每个Table的column有一定的上限值, 例如 MYSQL好像只能够256个Column而已
- 如果这样子设计, 会浪费很多空间, 例如之用到feedback1, 其他的column都是NULL, 累计5M 的booking记录, 就浪费了很多地方
- 会有效能跟编写query的困难等问题
那要怎样设计?
方案一:
建立一个feedback的table, 然后与booking 成1对N的关系, 如下图所示
- User 1---N Booking N---1 Maid
-
- Booking 1---N Feedback
复制代码
如果还是不太明白, 你就想象成 forum的 thread 跟 post
就是我开一个主题, 主题的内容, 标题, 日期都是记录在thread 里面
然后 其他人回post都是记录在 post里面, 然后 post有一个thread_id, 对到哪一个thread的
方案二:
直接设计成message的功能, 就是:
- User --- Booking --- Maid
- User --- Message --- Maid
复制代码
如果还是不懂, 在联络,
祝GBY, coding 永无bug.
|
评分
-
查看全部评分
|
|
|
|
|
|
|
发表于 19-3-2015 01:15 PM
|
显示全部楼层
如楼上所说的 database 其实会 更加的好 管理 而且 一个 table 是可以有 很多field 的
主要还是看你如何设计你的 database structure
但是如果你使用 text file 的话 恭喜你 很快你的 system 就可以用 蜗牛的 速度 来 retrieve data
而且更加的 容易 clash |
|
|
|
|
|
|
|
楼主 |
发表于 19-3-2015 10:08 PM
|
显示全部楼层
所以每当一个新的feedback我就要create一个新的field,比如,feedback(table_name),里面有username,feedback1,feedback2,当收到第三个feedback,自动create第三个feedback的field?
|
|
|
|
|
|
|
|
楼主 |
发表于 19-3-2015 10:13 PM
|
显示全部楼层
谢谢大大的回复,我还在仔细的看大大跟我解释的东西,目前我有一个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 编辑
晚上好, 快到我的睡觉时间了, 所以我长话短说
每页限制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 图
|
|
|
|
|
|
|
|
楼主 |
发表于 19-3-2015 11:14 PM
|
显示全部楼层
晚上好,谢谢大大解释得那么详细的还放图上来,我会去仔细研究和实践一下大大所跟我解释的东西.
现在才发觉懂的东西太少
|
|
|
|
|
|
|
|
发表于 20-3-2015 12:08 AM
|
显示全部楼层
就是feedback收在另一個table, 用id來連結
當然畫出來就很清楚了 |
|
|
|
|
|
|
|
楼主 |
发表于 21-3-2015 04:41 PM
|
显示全部楼层
id自己create的?谢谢大大的回复
|
|
|
|
|
|
|
|
楼主 |
发表于 21-3-2015 05:03 PM
|
显示全部楼层
午安,想问大大一些问题
现在我做了一个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了
我的问题是,比如 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 就可以了
例如:
- select count(*) as num from booking
- where maid_id = ".$maid_id." and
- book_date= ".$book_date." and
- book_1 is not null
复制代码
这时你select 出来的东西只会有一个field, 叫做num, 用php 把他fetch 出来, 判断他如果大于0,
表示 "大婶A" 在 "某一天" "某个时段" 被人预订了
code 会看起来像这样子:
- $result=mysql_query($sql);
- //判断mysql_query是否有顺利执行
- if(is_resource($result))
- {
- //从mysql result 里面拿出那个号码
- list($num)=mysql_fetch_array($result);
-
- //如果大于0
- if($num>0)
- {
- echo "已经被预订, 请选择其它时间";
- }
- }
复制代码
|
|
|
|
|
|
|
|
发表于 21-3-2015 11:36 PM
|
显示全部楼层
本帖最后由 musicalangel 于 21-3-2015 11:51 PM 编辑
OK, 这个post 我们讨论你的设计
对于时段, 我个人建议你可以有两种做法
做法1:
在你的php里面, 设定一个阵列:
- $book_time_list=array(
- "1"=>"8.00 AM - 12.00 PM",
- "2"=>"1.00 PM - 5.00 PM",
- "3"=>"6.00 PM - 10.00 PM"
- );
复制代码
然后在你的booking 的table 里面
book_1, book_2, book_3 删掉, 改成book_time, 记录1 或 2 或 3
你会问, 为什么?
这样一来, 你就能够用刚才设定的array, 做不同用途,
1) 下来选单的选项
2) 产生报表时, output 只要一个简单的写法, 就可以转成时间
- <table>
- <tr>
- <td>
- <?=$book_time_list[$book_time]?>
- </td>
- </tr>
- </table>
- PS:$book_time 是从DB select 出来的值
复制代码
3) 作为以后如果你要增加时段, 只须改这个阵列, 而不需修改table 的schema.
做法2:
改成 2个field, 一个为起始时间(start_time), 另外一个为(hour)
这样你的客人就可以单单定一个小时就好, 或者定足8个小时(弹性)
至于怎样避免重复, 那更简单了
mysql 有一个function 叫 addtime
范例如下:
- select count(*) as num from booking
- where maid_id=".$maid_id." and
- book_time <= "$start_time" and
- add_time(book_time, sec_to_time(hour*60*60)) >= ".$start_time."
复制代码
意思就是说, 如果新来的客人选择的时间介于某个开始的时间跟结束的时间(book_time+hour), 就满足select 的条件,
如果你人是在马六甲, 可以考虑来我公司做, 我慢慢教你. |
|
|
|
|
|
|
|
楼主 |
发表于 22-3-2015 10:29 AM
|
显示全部楼层
|
|
|
|
|
|
|
楼主 |
发表于 22-3-2015 02:04 PM
|
显示全部楼层
本帖最后由 shern91 于 22-3-2015 02:09 PM 编辑
其实我要怎样拿到1或2或3这个value呢?
因为我试echo value出来
- <?php
- $book_time_list=array(
- "1"=>"8.00 AM - 12.00 PM",
- "2"=>"1.00 PM - 5.00 PM",
- "3"=>"6.00 PM - 10.00 PM"
- );
- ?>
- <form method="POST">
- <input type="checkbox" class="option" name="time[]" value="<?= $book_time_list[1]?>" > 8.00 AM - 12.00 PM <br>
- <input type="checkbox" class="option" name="time[]" value="<?= $book_time_list[2]?>" > 1.00 PM - 5.00 PM <br>
- <input type="checkbox" class="option" name="time[]" value="<?= $book_time_list[3]?>" > 6.00 PM - 10.00 PM</td>
- <br>
- <input type="submit" value="Submit" name="submit">
- </form>
- <?php
- if(isset($_POST['submit'])){
- if(!empty($_POST['time'])){
- foreach($_POST['time'] $selected){
- echo $selected."</br>";
- }
- }
- }
- ?>
复制代码
可是我得到的output是时间,而不是1,2,3.还有一个问题是=>,这个operator其实我不是很明白,我是google了一下,它的功能是不是好像一个array里面,拿着两个不同的value?
|
|
|
|
|
|
|
|
发表于 22-3-2015 02:17 PM
|
显示全部楼层
似乎你很多基础没搞懂, 就算毕业出来, 也会很危险, 你要注意一下
我先回答你第二个问题,
- $book_time_list=array(
- "1"=>"8.00 AM - 12.00 PM",
- "2"=>"1.00 PM - 5.00 PM",
- "3"=>"6.00 PM - 10.00 PM"
- );
复制代码
这个code 就是宣告一个 1X3的阵列
然后 1, 2, 3 是 key 值, 8.00 AM - 12.00 PM是内容
在一般比较符号, => 是可以作为小于等于
但是在array 里面是作为 key 值 对应 value 值的符号
所以你在你的code 里面打
意思就是 $book_time_list 里面的第一个 value
所以他会出现 8.00 AM - 12.00 PM是正确的,
只是你搞糊涂了. |
|
|
|
|
|
|
|
楼主 |
发表于 22-3-2015 02:35 PM
|
显示全部楼层
本帖最后由 shern91 于 22-3-2015 02:39 PM 编辑
嗯,好的,明白了,一直麻烦大大不好意思了,可能我会将booking时间换成好像start time & end time. 这样可能也比较flexible和容易做比较
因为一开始大大建议我 “记录1 或 2 或 3” 让我误会了是拿来记录时间的slot 1,2,3 =》这个符号我以前没有用过的 》=这个就有 ,哈哈
|
|
|
|
|
|
|
|
发表于 23-3-2015 06:42 PM
|
显示全部楼层
如果我会嫌提供帮忙是很麻烦的话, 最初我就不会回答任何问题了,
在这边提供你最后的建议
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
|
显示全部楼层
好的,谢谢大大,如果booking做到,我最后一个要做的应该就是GPS了,不知道能不能做到,无意中看到apple的网址的GPS做是用current location来找最靠近或者靠近的repair service center,想大概做那样的,会在booking成功后尝试看
|
|
|
|
|
|
|
| |
本周最热论坛帖子
|