คำถามติดแท็ก pdo

PDO (PHP Data Objects) เป็นเลเยอร์นามธรรมที่เข้าถึงข้อมูล (อินเทอร์เฟซ) สำหรับ PHP ใช้งานได้กับระบบฐานข้อมูลส่วนใหญ่

7
PDO มีการจัดทำงบที่เพียงพอเพื่อป้องกันการฉีด SQL หรือไม่?
สมมติว่าฉันมีรหัสเช่นนี้: $dbh = new PDO("blahblah"); $stmt = $dbh->prepare('SELECT * FROM users where username = :username'); $stmt->execute( array(':username' => $_REQUEST['username']) ); เอกสาร PDO พูดว่า: ไม่จำเป็นต้องอ้างพารามิเตอร์ของคำสั่งที่เตรียมไว้ คนขับจัดการกับมันให้คุณ นั่นคือทั้งหมดที่ฉันต้องทำเพื่อหลีกเลี่ยงการฉีด SQL? มันง่ายจริงๆเหรอ? คุณสามารถสมมติว่า MySQL ถ้ามันสร้างความแตกต่าง นอกจากนี้ฉันแค่อยากรู้เกี่ยวกับการใช้งบเตรียมกับการฉีด SQL ในบริบทนี้ฉันไม่สนใจ XSS หรือช่องโหว่อื่น ๆ

21
ฉันสามารถผูกอาร์เรย์กับเงื่อนไข IN () ได้หรือไม่
ฉันอยากรู้ว่าเป็นไปได้ไหมที่จะผูกค่ากับตัวยึดตำแหน่งโดยใช้ PDO กรณีการใช้งานที่นี่กำลังพยายามส่งผ่านอาร์เรย์ของค่าเพื่อใช้กับIN()เงื่อนไข ฉันต้องการทำสิ่งนี้: <?php $ids=array(1,2,3,7,8,9); $db = new PDO(...); $stmt = $db->prepare( 'SELECT * FROM table WHERE id IN(:an_array)' ); $stmt->bindParam('an_array',$ids); $stmt->execute(); ?> และมี PDO ผูกและอ้างอิงค่าทั้งหมดในอาร์เรย์ ในขณะที่ฉันทำ: <?php $ids = array(1,2,3,7,8,9); $db = new PDO(...); foreach($ids as &$val) $val=$db->quote($val); //iterate through array and quote $in = implode(',',$ids); //create comma …


13
mysqli หรือ PDO - อะไรคือข้อดีและข้อเสีย? [ปิด]
ตามที่เป็นอยู่ในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบคำถาม & คำตอบของเรา เราคาดหวังคำตอบที่จะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้มีแนวโน้มที่จะเรียกร้องการอภิปรายการโต้แย้งการหยั่งเสียงหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงและเปิดใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อขอคำแนะนำ ปิดให้บริการใน7 ปีที่ผ่านมา ล็อคแล้ว คำถามและคำตอบนี้ถูกล็อคเนื่องจากคำถามอยู่นอกหัวข้อ แต่มีความสำคัญทางประวัติศาสตร์ ขณะนี้ไม่ยอมรับคำตอบหรือการโต้ตอบใหม่ ในสถานที่ของเราเราแยกระหว่างการใช้ mysqli และ PDO สำหรับสิ่งต่าง ๆ เช่นคำสั่งที่เตรียมไว้และการสนับสนุนการทำธุรกรรม บางโครงการใช้หนึ่งโครงการบางโครงการใช้บางโครงการ มีความเป็นไปได้น้อยมากที่เราจะย้ายไปที่ RDBMS อื่น ฉันชอบ PDO ด้วยเหตุผลเดียวที่ให้พารามิเตอร์ที่มีชื่อสำหรับคำสั่งที่เตรียมไว้และเท่าที่ฉันทราบ mysqli ไม่ได้ มีข้อดีและข้อเสียอื่น ๆ หรือไม่ในการเลือกข้อใดข้อหนึ่งเป็นมาตรฐานในขณะที่เรารวมโครงการของเราเพื่อใช้เพียงแนวทางเดียว

30
PDOException SQLSTATE [HY000] [2002] ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว
ฉันเชื่อว่าฉันได้ติดตั้งไซต์ (ขั้นพื้นฐาน) ของฉันไปยัง fortrabbit ได้สำเร็จ แต่ทันทีที่ฉันเชื่อมต่อกับ SSH เพื่อเรียกใช้คำสั่งบางอย่าง (เช่นphp artisan migrateหรือphp artisan db:seed) ฉันได้รับข้อความแสดงข้อผิดพลาด: [PDOException] SQLSTATE[HY000] [2002] No such file or directory เมื่อถึงจุดหนึ่งการโยกย้ายต้องทำงานเพราะตารางของฉันอยู่ที่นั่น - แต่นี่ไม่ได้อธิบายว่าทำไมตอนนี้มันจึงไม่ทำงานสำหรับฉัน
319 php  mysql  laravel  pdo 

30
PDOException“ ไม่พบไดรเวอร์”
ผมได้ติดตั้งเพียง Debian Lenny กับ Apache, MySQL และ PHP และฉันได้รับ could not find driverPDOException นี่เป็นบรรทัดรหัสเฉพาะที่อ้างถึง: $dbh = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_NAME, DB_USER, DB_PASS) DB_HOST, DB_NAME, DB_USERและDB_PASSมีค่าคงที่ที่ผมได้กำหนดไว้ ทำงานได้ดีบนเซิร์ฟเวอร์ที่ใช้งานจริง (และในการตั้งค่าเซิร์ฟเวอร์ Ubuntu ก่อนหน้าของฉัน) สิ่งนี้เกี่ยวข้องกับการติดตั้ง PHP ของฉันหรือไม่? การค้นหาอินเทอร์เน็ตไม่ได้ช่วยอะไรทั้งหมดที่ฉันได้รับคือการแลกเปลี่ยนผู้เชี่ยวชาญและตัวอย่าง แต่ไม่มีวิธีแก้ปัญหา
292 php  mysql  pdo  lamp 

7
PHP PDO Statement สามารถรับชื่อตารางหรือคอลัมน์เป็นพารามิเตอร์ได้หรือไม่?
ทำไมฉันไม่สามารถส่งชื่อตารางไปยังคำสั่ง PDO ที่เตรียมไว้ได้ $stmt = $dbh->prepare('SELECT * FROM :table WHERE 1'); if ($stmt->execute(array(':table' => 'users'))) { var_dump($stmt->fetchAll()); } มีวิธีที่ปลอดภัยอีกวิธีหนึ่งในการแทรกชื่อตารางลงในแบบสอบถาม SQL หรือไม่ ด้วยความปลอดภัยฉันหมายความว่าฉันไม่ต้องการทำ $sql = "SELECT * FROM $table WHERE 1"
243 php  pdo 

23
นับแถวด้วย PDO
มีข้อความที่ขัดแย้งมากมายอยู่รอบตัว วิธีที่ดีที่สุดในการนับแถวโดยใช้ PDO ใน PHP คืออะไร? ก่อนที่จะใช้ PDO mysql_num_rowsฉันเพียงแค่ใช้เพียง fetchAll เป็นสิ่งที่ฉันไม่ต้องการเพราะบางครั้งฉันอาจต้องรับมือกับชุดข้อมูลขนาดใหญ่ดังนั้นจึงไม่ดีสำหรับการใช้งานของฉัน คุณมีข้อเสนอแนะใด?
192 php  mysql  pdo 

10
PHP PDO: ชุดอักขระตั้งชื่อ?
ฉันมีสิ่งนี้ก่อนหน้านี้ในการเชื่อมต่อ mysql_ * ปกติของฉัน: mysql_set_charset("utf8",$link); mysql_query("SET NAMES 'UTF8'"); ฉันต้องการมันสำหรับ PDO หรือไม่? และฉันควรจะได้ที่ไหน $connect = new PDO("mysql:host=$host;dbname=$db", $user, $pass, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
189 php  mysql  pdo 

8
อะไรคือข้อเสียของการใช้การเชื่อมต่อแบบถาวรใน PDO
ใน PDO สามารถทำการเชื่อมต่อถาวรโดยใช้PDO::ATTR_PERSISTENTแอ็ตทริบิวต์ ตามคู่มือ php - การเชื่อมต่อแบบต่อเนื่องจะไม่ปิดในตอนท้ายของสคริปต์ แต่จะถูกแคชและนำมาใช้ใหม่เมื่อสคริปต์อื่นร้องขอการเชื่อมต่อโดยใช้ข้อมูลประจำตัวเดียวกัน แคชการเชื่อมต่อถาวรช่วยให้คุณหลีกเลี่ยงค่าใช้จ่ายในการสร้างการเชื่อมต่อใหม่ทุกครั้งที่สคริปต์ต้องการพูดคุยกับฐานข้อมูลทำให้เว็บแอปพลิเคชั่นทำงานได้เร็วขึ้น คู่มือยังไม่แนะนำให้ใช้การเชื่อมต่อแบบถาวรในขณะที่ใช้ไดรเวอร์ PDO ODBC เพราะอาจขัดขวางกระบวนการเชื่อมต่อ ODBC เห็นได้ชัดว่าดูเหมือนว่าจะไม่มีข้อเสียของการใช้การเชื่อมต่อแบบถาวรใน PDO ยกเว้นในกรณีสุดท้าย อย่างไรก็ตามฉันต้องการทราบว่ามีข้อเสียอื่น ๆ ของการใช้กลไกนี้หรือไม่เช่นสถานการณ์ที่กลไกนี้ส่งผลให้ประสิทธิภาพการทำงานลดลงหรือเป็นเช่นนั้น
181 php  pdo 

30
ข้อผิดพลาดในการย้ายข้อมูล Laravel: ข้อผิดพลาดทางไวยากรณ์หรือการละเมิดการเข้าถึง: 1071 รหัสที่ระบุยาวเกินไป ความยาวสูงสุดของคีย์คือ 767 ไบต์
ข้อผิดพลาดในการย้ายข้อมูลใน Laravel 5.4 ด้วย php artisan make:auth [Illuminate \ Database \ QueryException] SQLSTATE [42000]: ข้อผิดพลาดทางไวยากรณ์หรือการละเมิดการเข้าถึง: 1071 รหัสที่ระบุยาวเกินไป ความยาวของคีย์สูงสุดคือ 767 ไบต์ (SQL: แก้ไขอี tabl usersเพิ่มที่ไม่ซ้ำกันusers_email_unique( email)) [PDOException] SQLSTATE [42000]: ข้อผิดพลาดทางไวยากรณ์หรือการละเมิดการเข้าถึง: 1071 รหัสที่ระบุยาวเกินไป ความยาวสูงสุดของคีย์คือ 767 ไบต์

3
PDO รับ ID ล่าสุดที่ถูกแทรก
ฉันมีแบบสอบถามและฉันต้องการแทรก ID ล่าสุด ID ฟิลด์เป็นคีย์หลักและการเพิ่มอัตโนมัติ ฉันรู้ว่าฉันต้องใช้คำสั่งนี้: LAST_INSERT_ID() คำสั่งนั้นใช้ได้กับข้อความค้นหาเช่นนี้: $query = "INSERT INTO `cell-place` (ID) VALUES (LAST_INSERT_ID())"; แต่ถ้าฉันต้องการรับ ID โดยใช้คำสั่งนี้: $ID = LAST_INSERT_ID(); ฉันได้รับข้อผิดพลาดนี้: Fatal error: Call to undefined function LAST_INSERT_ID() ผมทำอะไรผิดหรือเปล่า?
158 php  mysql  database  pdo 

22
PDO ที่เตรียมไว้แทรกหลายแถวในแบบสอบถามเดียว
ขณะนี้ฉันใช้ SQL ประเภทนี้บน MySQL เพื่อแทรกค่าหลายแถวในแบบสอบถามเดียว: INSERT INTO `tbl` (`key1`,`key2`) VALUES ('r1v1','r1v2'),('r2v1','r2v2'),... ในการอ่านใน PDO คำสั่งที่เตรียมไว้ควรให้ความปลอดภัยที่ดีกว่าแบบสอบถามแบบคงที่ ฉันต้องการทราบว่าเป็นไปได้หรือไม่ที่จะสร้าง "การแทรกค่าหลายแถวโดยใช้การค้นหาหนึ่งคำ" โดยใช้คำสั่งที่เตรียมไว้ ถ้าใช่ฉันจะรู้ได้อย่างไรว่าฉันจะใช้มันได้อย่างไร

18
วิธีการดีบักการสืบค้นฐานข้อมูล PDO
ก่อนที่จะย้ายไปที่ PDO ฉันสร้างแบบสอบถาม SQL ใน PHP โดยเชื่อมสตริงเข้าด้วยกัน หากฉันมีข้อผิดพลาดทางไวยากรณ์ของฐานข้อมูลฉันสามารถสะท้อนสตริงเคียวรี SQL สุดท้ายลองด้วยตัวเองบนฐานข้อมูลและปรับแต่งมันจนกว่าฉันจะแก้ไขข้อผิดพลาดจากนั้นนำกลับเข้าไปในรหัส คำสั่ง PDO ที่เตรียมไว้นั้นเร็วขึ้นและดีขึ้นและปลอดภัยขึ้น แต่สิ่งหนึ่งที่รบกวนฉัน: ฉันไม่เคยเห็นข้อความค้นหาสุดท้ายเมื่อส่งไปยังฐานข้อมูล เมื่อฉันได้รับข้อผิดพลาดเกี่ยวกับไวยากรณ์ในบันทึก Apache หรือไฟล์บันทึกที่กำหนดเอง (ฉันบันทึกข้อผิดพลาดภายในcatchบล็อก) ฉันไม่เห็นข้อความค้นหาที่ทำให้เกิดปัญหา มีวิธีจับแบบสอบถาม SQL ที่สมบูรณ์ส่งโดย PDO ไปยังฐานข้อมูลและบันทึกลงในไฟล์หรือไม่
140 php  sql  pdo 

16
รับสตริงแบบสอบถาม SQL ดิบจากคำสั่งที่เตรียมไว้ของ PDO
มีวิธีในการเรียกใช้สตริง SQL ดิบเมื่อเรียกใช้ PDOStatement :: execute () บนคำสั่งที่เตรียมไว้หรือไม่ สำหรับวัตถุประสงค์ในการดีบักสิ่งนี้จะเป็นประโยชน์อย่างยิ่ง
130 php  sql  mysql  pdo  pdostatement 

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.