คำถามติดแท็ก prepared-statement

Prepared Statement (หรือคำสั่งที่กำหนดพารามิเตอร์) เป็นคำสั่ง SQL ที่คอมไพล์ไว้ล่วงหน้าซึ่งทำหน้าที่ปรับปรุงประสิทธิภาพและลดการโจมตี SQL injection คำสั่งที่เตรียมไว้ใช้ในระบบจัดการฐานข้อมูลเชิงสัมพันธ์ที่เป็นที่นิยมจำนวนมาก

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 …

30
เตรียมสถานะในทางเลือกข้อ?
วิธีแก้ไขปัญหาที่ดีที่สุดสำหรับการใช้ส่วนINคำสั่งSQL กับอินสแตนซ์java.sql.PreparedStatementซึ่งไม่ได้รับการสนับสนุนสำหรับค่าหลายค่าเนื่องจากปัญหาด้านความปลอดภัยในการโจมตี SQL injection: ?ตัวยึดตำแหน่งหนึ่งแทนค่าหนึ่งค่าแทนที่จะเป็นรายการค่า พิจารณาคำสั่ง SQL ต่อไปนี้: SELECT my_column FROM my_table where search_column IN (?) การใช้preparedStatement.setString( 1, "'A', 'B', 'C'" );นั้นเป็นความพยายามที่ไม่ทำงานในการแก้ปัญหาของเหตุผล?ในการใช้งานตั้งแต่แรก มีวิธีแก้ไขปัญหาอะไรบ้าง

6
ใช้สัญลักษณ์ตัวแทน“ like” ในคำสั่งที่เตรียมไว้
ฉันใช้คำสั่งที่เตรียมไว้เพื่อดำเนินการค้นหาฐานข้อมูล mysql และฉันต้องการที่จะใช้ฟังก์ชั่นการค้นหาตามคำหลักแปลก ๆ เพื่อที่ฉันจะต้องใช้LIKEคำหลักที่ฉันรู้ และฉันยังเคยใช้งบเตรียมมาก่อน แต่ฉันไม่รู้ว่าจะใช้มันอย่างไรLIKEเพราะจากรหัสต่อไปนี้ฉันจะเพิ่มได้'keyword%'ที่ไหน? ฉันสามารถใช้มันโดยตรงในpstmt.setString(1, notes)ฐานะที่เป็น(1, notes+"%")หรืออะไรทำนองนั้น ฉันเห็นโพสต์มากมายบนเว็บนี้ แต่ไม่มีคำตอบที่ดีเลย PreparedStatement pstmt = con.prepareStatement( "SELECT * FROM analysis WHERE notes like ?"); pstmt.setString(1, notes); ResultSet rs = pstmt.executeQuery();

9
งบที่เตรียมไว้สามารถป้องกันการโจมตีจากการฉีด SQL ได้อย่างไร
วิธีการทำงบเตรียมช่วยเราป้องกันการฉีด SQLการโจมตี? Wikipedia พูดว่า: คำสั่งที่เตรียมไว้มีความยืดหยุ่นต่อการฉีด SQL เนื่องจากค่าพารามิเตอร์ซึ่งถูกส่งในภายหลังโดยใช้โปรโตคอลที่แตกต่างกันจึงไม่จำเป็นต้องหลบหนีอย่างถูกต้อง หากเทมเพลตคำสั่งดั้งเดิมไม่ได้มาจากอินพุตภายนอกการฉีด SQL จะไม่เกิดขึ้น ฉันไม่เห็นเหตุผลที่ดีมาก อะไรจะเป็นคำอธิบายที่ง่ายในภาษาอังกฤษง่าย ๆ และตัวอย่างบางส่วน?

13
ฉันจะรับ SQL ของ PreparedStatement ได้อย่างไร
ฉันมีวิธี Java ทั่วไปที่มีลายเซ็นวิธีการดังต่อไปนี้: private static ResultSet runSQLResultSet(String sql, Object... queryParams) มันเปิดการเชื่อมต่อสร้างการPreparedStatementใช้คำสั่ง sql และพารามิเตอร์ในqueryParamsอาร์เรย์ความยาวตัวแปรเรียกใช้แคชResultSet(ในCachedRowSetImpl), ปิดการเชื่อมต่อและส่งกลับชุดผลแคช ฉันมีข้อยกเว้นการจัดการในวิธีการที่บันทึกข้อผิดพลาด ฉันบันทึกคำสั่ง sql เป็นส่วนหนึ่งของบันทึกเนื่องจากมีประโยชน์มากสำหรับการแก้ไขข้อบกพร่อง ปัญหาของฉันคือการบันทึกตัวแปร String จะsqlบันทึกคำสั่งเทมเพลตด้วยหรือไม่แทนค่าจริง ฉันต้องการบันทึกคำสั่งจริงที่ดำเนินการ (หรือพยายามดำเนินการ) ดังนั้น ... มีวิธีที่จะได้รับคำสั่ง SQL ที่เกิดขึ้นจริงที่จะดำเนินการโดยใดPreparedStatement? ( โดยไม่ต้องสร้างมันด้วยตัวเองถ้าฉันไม่สามารถหาวิธีเข้าถึงPreparedStatement'sSQL ได้ฉันอาจจะสร้างมันด้วยตัวเองในcatches)

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

10
PreparedStatement จะหลีกเลี่ยงหรือป้องกันการแทรก SQL ได้อย่างไร
ฉันรู้ว่า PreparedStatements หลีกเลี่ยง / ป้องกัน SQL Injection มันทำได้อย่างไร? แบบสอบถามฟอร์มสุดท้ายที่สร้างโดยใช้ PreparedStatements จะเป็นสตริงหรืออย่างอื่น?

1
mysqli_fetch_assoc () คาดว่าจะมีข้อผิดพลาดพารามิเตอร์ / เรียกไปยังฟังก์ชันสมาชิก bind_param () จะรับข้อผิดพลาด mysql จริงและแก้ไขได้อย่างไร?
ในสภาพแวดล้อมโลคัล / การพัฒนาของฉันคิวรี MySQLi ทำงานได้ดี อย่างไรก็ตามเมื่อฉันอัปโหลดในสภาพแวดล้อมการโฮสต์เว็บฉันได้รับข้อผิดพลาดนี้: ข้อผิดพลาดร้ายแรง: เรียกใช้ฟังก์ชันสมาชิก bind_param () บนวัตถุที่ไม่ใช่ใน ... นี่คือรหัส: global $mysqli; $stmt = $mysqli->prepare("SELECT id, description FROM tbl_page_answer_category WHERE cur_own_id = ?"); $stmt->bind_param('i', $cur_id); $stmt->execute(); $stmt->bind_result($uid, $desc); ในการตรวจสอบคำถามของฉันฉันพยายามดำเนินการค้นหาผ่านแผงควบคุม phpMyAdmin และผลลัพธ์ก็โอเค


2
การใช้ PreparedStatement ซ้ำหลาย ๆ ครั้ง
ในกรณีของการใช้ PreparedStatement กับการเชื่อมต่อทั่วไปเพียงครั้งเดียวโดยไม่มีพูลใด ๆ ฉันสามารถสร้างอินสแตนซ์ใหม่สำหรับการดำเนินการ dml / sql ทุกครั้งที่มีอำนาจของคำสั่งที่เตรียมไว้ได้หรือไม่ ฉันหมายถึง: for (int i=0; i<1000; i++) { PreparedStatement preparedStatement = connection.prepareStatement(sql); preparedStatement.setObject(1, someValue); preparedStatement.executeQuery(); preparedStatement.close(); } แทน: PreparedStatement preparedStatement = connection.prepareStatement(sql); for (int i=0; i<1000; i++) { preparedStatement.clearParameters(); preparedStatement.setObject(1, someValue); preparedStatement.executeQuery(); } preparedStatement.close(); คำถามของฉันเกิดจากการที่ฉันต้องการใส่รหัสนี้ในสภาพแวดล้อมแบบมัลติเธรดคุณสามารถให้คำแนะนำได้หรือไม่? ขอบคุณ

6
Java: แทรกหลายแถวใน MySQL ด้วย PreparedStatement
ฉันต้องการแทรกหลายแถวลงในตาราง MySQL พร้อมกันโดยใช้ Java จำนวนแถวเป็นแบบไดนามิก เมื่อก่อนผมทำ ... for (String element : array) { myStatement.setString(1, element[0]); myStatement.setString(2, element[1]); myStatement.executeUpdate(); } ฉันต้องการปรับให้เหมาะสมเพื่อใช้ไวยากรณ์ที่รองรับ MySQL: INSERT INTO table (col1, col2) VALUES ('val1', 'val2'), ('val1', 'val2')[, ...] แต่ด้วยความที่PreparedStatementฉันไม่รู้วิธีทำสิ่งนี้เนื่องจากฉันไม่รู้มาก่อนว่าarrayจะมีองค์ประกอบกี่อย่าง ถ้าเป็นไปไม่ได้ด้วย a PreparedStatementฉันจะทำได้อย่างไร (และยังคงหลบหนีค่าในอาร์เรย์)

5
PreparedStatement setNull (.. )
Java PreparedStatement ให้ความเป็นไปได้ในการตั้งค่า Null อย่างชัดเจน ความเป็นไปได้นี้คือ: prepStmt.setNull(parameterIndex, Types.VARCHAR); ความหมายของการเรียกนี้เหมือนกับเมื่อใช้ setType เฉพาะกับพารามิเตอร์ null หรือไม่ prepStmt.setString(null); เหรอ?

3
การปรับให้เหมาะสมของ Oracle JDBC: เปิดใช้งานแคช PreparedStatement ในแอปพลิเคชัน Spring boot
ฉันมีแอพพลิเคชั่น Spring Boot REST ที่เชื่อมต่อกับฐานข้อมูล Oracle เรากำลังใช้ JDBC โดยใช้ JdbcTemplate คุณสมบัติฐานข้อมูล Oracle ได้รับจากการตั้งค่า3 แอพพลิเคชั่นคุณสมบัติเหล่านี้: spring.datasource.url spring.datasource.username spring.datasource.password แอปพลิเคชันนี้ใช้ HikariCP จากเว็บไซต์ HikariCP ฉันรู้ว่าพูลนี้ไม่แคช PreparedStatements เนื่องจากไดรเวอร์ JDBC เป็นโปรแกรมติดตั้งที่ดีที่สุด ตอนนี้ฉันจะระบุและที่ไหนเพื่อให้มั่นใจว่าสิ่งเหล่านี้: โปรแกรมควบคุม Oracle JDBC (ojdbc7.jar) แคช PreparedStatements มีวิธีการกำหนดจำนวน PreparedStatements ที่สามารถแคชได้หรือไม่ จากhttps://howtodoinjava.com/java/jdbc/best-practices-to-improve-jdbc-performance/เราจะเห็นว่า ตรวจสอบให้แน่ใจว่าฐานข้อมูลของคุณถูกตั้งค่าเป็นขนาดแพ็คเก็ตสูงสุดและไดรเวอร์ตรงกับขนาดแพ็คเก็ตนั้น สำหรับการดึงชุดผลลัพธ์ที่มีขนาดใหญ่กว่านี้จะลดจำนวนของแพ็กเก็ตทั้งหมดที่ส่ง / รับระหว่างไดรเวอร์และเซิร์ฟเวอร์ ในการปฏิบัติตามข้างต้นสิ่งที่เป็นขั้นตอนที่จำเป็นในการ ค้นหาขนาดแพ็คเก็ต Oracle DB Server ค้นหาว่า Oracle DB Server …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.