ช่วยด้วยคับมันไม่ตรวจ duplicate ใน ฐานข้อมูล

เริ่มโดย Mrpoohling, 16 กุมภาพันธ์ 2017, 18:13:02

หัวข้อก่อนหน้า - หัวข้อถัดไป

0 สมาชิก และ 1 ผู้มาเยือน กำลังดูหัวข้อนี้

Mrpoohling

ผมทำ form textarea โดยจะให้มัน insert แบบ Multi Line
เช่น

OOOOOO,5555555
AAAAAAA,2222222
BBBBBBBB,2122221
CCCCCCC,5565656

เมื่อเพิ่มทีละ Line จะสามารถตรวจสอบ duplicate ใน ฐานข้อมูล ได้ แต่เมื่อ submit แบบ multi มันไม่ตรวจสอบให้  :'(

---------------------------------------------------------------------------------------------------------------------
$addtext = $_POST['additem'];

$lines = explode("\n", $addtext);
$addtext= explode(',', $addtext);

$info = mysql_real_escape_string($addtext[0]);
$item = mysql_real_escape_string($addtext[1]);

foreach($lines as $line) {

   list($info,$item) = explode(",", $line);

   $sql = "select * from data where item='$item' and user_name='$user_name'";
   $db_query=mysql_query($sql);
   $num_rows=mysql_num_rows($db_query);

   if($num_rows != 0) {
   echo "item ซ้ำ";
   } else {
   $insert ............................

-------------------------------------------------------------------------------------------------------------------------


รบกวนช่วยแนะนำหน่อยครับ :P :P


อ้างถึงจาก: Mrpoohling ใน 17 กุมภาพันธ์ 2017, 07:07:35
ทำได้แล้วครับ

โดยการเปลี่ยน $lines = explode("\n", $addtext);
เป็น
$lines = explode("\n", str_replace("\r", "", $addtext));
แทน

งงแท้  :P :P :P

ยังไงก็ขอ ขอบคุณทุกความเห็นนะครับ  :wanwan017:
[direct=https://c.lazada.co.th/t/c.bfS0An]9.9 จัดเต็มลดกระหน่ำ[/direct]


Mrpoohling

[direct=https://c.lazada.co.th/t/c.bfS0An]9.9 จัดเต็มลดกระหน่ำ[/direct]

Sith9

อ้างถึงจาก: Mrpoohling ใน 16 กุมภาพันธ์ 2017, 19:22:04
อ้างถึงจาก: Sith9 ใน 16 กุมภาพันธ์ 2017, 19:08:34
if num_rows > 0 ซ้ำ


เหมือนกันกับอันนี้ครับ if($num_rows != 0) {

จริงด้วย เขินเลย ขอโทษด้วยครับ :-[

ที่คิดตอนนี้คืออยากให้เช็คในส่วนของ query ว่าทำงานถูกต้องหรือเปล่า เพราะ num_rows อาจจะมีค่าเป็น false

Mrpoohling

อ้างถึงจาก: Sith9 ใน 16 กุมภาพันธ์ 2017, 19:33:54
อ้างถึงจาก: Mrpoohling ใน 16 กุมภาพันธ์ 2017, 19:22:04
อ้างถึงจาก: Sith9 ใน 16 กุมภาพันธ์ 2017, 19:08:34
if num_rows > 0 ซ้ำ


เหมือนกันกับอันนี้ครับ if($num_rows != 0) {

จริงด้วย เขินเลย ขอโทษด้วยครับ :-[

ที่คิดตอนนี้คืออยากให้เช็คในส่วนของ query ว่าทำงานถูกต้องหรือเปล่า เพราะ num_rows อาจจะมีค่าเป็น false

ครับไม่เปนไร หาทางต่อไป  :P :P :P :P
[direct=https://c.lazada.co.th/t/c.bfS0An]9.9 จัดเต็มลดกระหน่ำ[/direct]

AbuseMan

อันนี้ขอแนะนำการนับจำนวนข้อมูลในฐานข้อมูล อยากให้ใช้แบบนี้มากกว่า


$sql = 'SELECT COUNT(*) AS total_rows FROM table WHERE field = something';
$result = mysql_query($sql);
$row = mysql_fetch_assoc($result);
if($row['total_rows'] == 0) { echo 'ยังไม่มี Record'; }
█ [direct=https://radio.sukson.com]ฟังเพลงออนไลน์[/direct] : เว็บเพลงออนไลน์ที่คุณขอฟังเพลงได้ด้วยตัวคุณเอง
█ [direct=https://chat.sukson.com]ห้องแชท[/direct] : บริการฟรีห้องแชทสำหรับติดเว็บ
█ [direct=https://music.sukson.com]เพลงใหม่[/direct] : เพลงใหม่ เพลงฮิต
█ [direct=https://bankumka.com]บ้านคุ้มค่า[/direct] : ลงประกาศขายบ้าน ที่ดิน พร้อมอัพเดทโครงการบ้านและคอนโดใหม่ที่น่าสนใจ

ten1312

ผมมือใหม่แต่อยากแนะนำตามที่ผมรู้
รับค่ามาเก็บไว้แบบ array แล้วใช้ for วนลูปเอาได้ไหม
เวลา where ก็ใช้ $ตัวแปร[$i] แบบนี้
บันทึกการเรียนเขียน Program
Java :2 พย. 2559 - 19 พย. 2559 หยุดไว้ก่อน
PHP SQL HTML CSS Bootstrap : 25 พย. 2559 - ปัจจุบัน
Javascript jQuery Ajax Angular JS : เรียนผ่านๆยังไม่จริงจัง

[direct=https://www.nanakaset.com]นานาเกษตร[/direct]

sputtaro

#7
 list($info,$item) = explode(",", $line);
ค่าที่ได้จาก $line ถูกแยกเก็บไว้ใน $info กับ $item
แต่ เวลานำค่านี้ไปใส่ใน query คุณกลับใช้ item='$item' and user_name='$user_name'
ผมเลยสงสัยว่า คุณเอา $user_name มาจากไหน หรือผมอาจเข้าใจผิดไปก็เป็นได้ เพราะคุณไม่ได้พูดถึงโค๊ดส่วนอื่นๆ

แต่ถ้าผมไม่ได้เข้าใจผิด ลองแก้ไขดูครับ
ในขั้นตอนสั่ง  list($info,$item) = explode(",", $line); แลัว
ลอง echo เพื่อดูค่าที่ได้
จากนั้นแก้ไข item='$item' and user_name='$user_name' ให้ถูกต้อง

หวังว่าจะใช่นะ

************************
ขอเพิ่มอีกนิด คือ
ตอนเขียนโค๊ดเพื่อทดสอบ คุณอาจใส่โค๊ดให้แสดง error ของ mysql ด้วยก็จะ ทำให้รู่สาเหตุได้ง่ายขึ้น
เมือจะใช้งานจริง ค่อยลบออก

Mrpoohling

อ้างถึงจาก: sputtaro ใน 16 กุมภาพันธ์ 2017, 23:28:41
list($info,$item) = explode(",", $line);
ค่าที่ได้จาก $line ถูกแยกเก็บไว้ใน $info กับ $item
แต่ เวลานำค่านี้ไปใส่ใน query คุณกลับใช้ item='$item' and user_name='$user_name'
ผมเลยสงสัยว่า คุณเอา $user_name มาจากไหน หรือผมอาจเข้าใจผิดไปก็เป็นได้ เพราะคุณไม่ได้พูดถึงโค๊ดส่วนอื่นๆ

แต่ถ้าผมไม่ได้เข้าใจผิด ลองแก้ไขดูครับ
ในขั้นตอนสั่ง  list($info,$item) = explode(",", $line); แลัว
ลอง echo เพื่อดูค่าที่ได้
จากนั้นแก้ไข item='$item' and user_name='$user_name' ให้ถูกต้อง

หวังว่าจะใช่นะ

************************
ขอเพิ่มอีกนิด คือ
ตอนเขียนโค๊ดเพื่อทดสอบ คุณอาจใส่โค๊ดให้แสดง error ของ mysql ด้วยก็จะ ทำให้รู่สาเหตุได้ง่ายขึ้น
เมือจะใช้งานจริง ค่อยลบออก

user_name มาจาก session และโค้สไม่มีเออเรอครับ ประเด็นคือ เมื่อเพิ่มทีละ Line จะสามารถตรวจสอบ duplicate ใน ฐานข้อมูล ได้ แต่เมื่อ submit แบบ multi มันไม่ตรวจสอบให้ 

:P :P :P

[direct=https://c.lazada.co.th/t/c.bfS0An]9.9 จัดเต็มลดกระหน่ำ[/direct]

Mrpoohling

ทำได้แล้วครับ

โดยการเปลี่ยน $lines = explode("\n", $addtext);
เป็น
$lines = explode("\n", str_replace("\r", "", $addtext));
แทน

งงแท้  :P :P :P

ยังไงก็ขอ ขอบคุณทุกความเห็นนะครับ  :wanwan017:
[direct=https://c.lazada.co.th/t/c.bfS0An]9.9 จัดเต็มลดกระหน่ำ[/direct]


f206cs

อ้างถึงจาก: Mrpoohling ใน 17 กุมภาพันธ์ 2017, 07:07:35
ทำได้แล้วครับ

โดยการเปลี่ยน $lines = explode("\n", $addtext);
เป็น
$lines = explode("\n", str_replace("\r", "", $addtext));
แทน

งงแท้  :P :P :P

ยังไงก็ขอ ขอบคุณทุกความเห็นนะครับ  :wanwan017:

แหม่ เส้นผมบังภูเขา

ปกติเวลากด enter ที่ keyboard มันไม่ได้มีแค่ \n แต่มันจะเป็น \n\r
\n = ขึ้นบรรทัดใหม่
\r = เลื่อนเคอร์เซอร์ไปต้นบรรทัด

ตอนแรกที่ใช้แค่ $lines = explode("\n", $addtext); ตัว \r มันยังอยู่ (เรามองไม่เห็น)
ทีนี้เมื่อเอาไปใส่ในคำสั่ง sql มันก็เลยติด \r ไปด้วย แต่ในฐานข้อมูล คิดว่าไม่มี \r
(อาจจะเป็นรายการที่ทดสอบ คีย์เข้าไปตรงๆ หรือคีย์เข้าไปแบบบรรทัดเดียว)

มันก็เลยมองว่าตัวที่คีย์หลายบรรทัด ที่มี \r ซ่อนอยู่ กับตัวที่อยู่ในฐานข้อมูลซึ่งไม่มี \r เป็นคนละตัวกัน
ก็เลยไม่ duplicate ครับ

สรุปก็ประมาณนี้แหละครับ

:wanwan003:


cloverink

ใช้ PHP_EOL ก็ได้ครับ ( eol = end of line )

explode(PHP_EOL, $x)

ส่วน query ใช้ count(*) นะครับ เพราะ ถ้าใช้ num row bug แน่นอน เวลามี query error

Mrpoohling

อ้างถึงจาก: f206cs ใน 17 กุมภาพันธ์ 2017, 15:35:11
อ้างถึงจาก: Mrpoohling ใน 17 กุมภาพันธ์ 2017, 07:07:35
ทำได้แล้วครับ

โดยการเปลี่ยน $lines = explode("\n", $addtext);
เป็น
$lines = explode("\n", str_replace("\r", "", $addtext));
แทน

งงแท้  :P :P :P

ยังไงก็ขอ ขอบคุณทุกความเห็นนะครับ  :wanwan017:

แหม่ เส้นผมบังภูเขา

ปกติเวลากด enter ที่ keyboard มันไม่ได้มีแค่ \n แต่มันจะเป็น \n\r
\n = ขึ้นบรรทัดใหม่
\r = เลื่อนเคอร์เซอร์ไปต้นบรรทัด

ตอนแรกที่ใช้แค่ $lines = explode("\n", $addtext); ตัว \r มันยังอยู่ (เรามองไม่เห็น)
ทีนี้เมื่อเอาไปใส่ในคำสั่ง sql มันก็เลยติด \r ไปด้วย แต่ในฐานข้อมูล คิดว่าไม่มี \r
(อาจจะเป็นรายการที่ทดสอบ คีย์เข้าไปตรงๆ หรือคีย์เข้าไปแบบบรรทัดเดียว)

มันก็เลยมองว่าตัวที่คีย์หลายบรรทัด ที่มี \r ซ่อนอยู่ กับตัวที่อยู่ในฐานข้อมูลซึ่งไม่มี \r เป็นคนละตัวกัน
ก็เลยไม่ duplicate ครับ

สรุปก็ประมาณนี้แหละครับ

:wanwan003:



โอ้วได้ความรู้ทีเดียว ขอบคุณครับ
[direct=https://c.lazada.co.th/t/c.bfS0An]9.9 จัดเต็มลดกระหน่ำ[/direct]