การติดตั้งไดรเวอร์ PDO บนเซิร์ฟเวอร์ MySQL Linux


102

เมื่อไม่นานมานี้ฉันได้รับคำแนะนำให้เปลี่ยนรหัสของฉันไปใช้ PDO เพื่อกำหนดพารามิเตอร์การสืบค้นของฉันและบันทึก HTML ในฐานข้อมูลอย่างปลอดภัย

นี่คือปัญหาหลัก:

  1. ฉันดูที่http://php.net/manual/en/ref.pdo-mysql.phpแล้วฉันไม่เข้าใจจริงๆว่าฉันควรวาง$ ./configure --with-pdo-mysqlสตริงนั้น...

  2. ไซต์ที่ฉันกำลังสร้างนั้นต้องใช้ PDO สำหรับหนึ่งเพจเท่านั้น ในขณะที่ฉันอาจพิจารณาเขียนใหม่ แต่ต้องใช้เวลาสักครู่และฉันต้องการให้หน้าต่างๆทำงานเร็ว ๆ นี้ดังนั้นฉันจึงไม่สามารถปิด MySQL ได้ทั้งหมด หากฉันติดตั้ง PDO ฉันจะยังใช้mysql_*ตัวจัดการได้หรือไม่

เซิร์ฟเวอร์ที่เป็นปัญหากำลังเรียกใช้ PHP เวอร์ชัน 5.4.6-1ubuntu1 และ Apache / 2.2.22 (Ubuntu) ฉันกำลังเรียกใช้ฐานข้อมูล phpMyAdmin ด้วยหากเป็นเรื่องสำคัญ

คำตอบ:


183

บน Ubuntu คุณควรจะสามารถติดตั้งชิ้นส่วน PDO ที่จำเป็นจาก apt โดยใช้ sudo apt-get install php5-mysql

ไม่มีข้อ จำกัด ระหว่างการใช้ PDO และ mysql_ พร้อมกัน อย่างไรก็ตามคุณจะต้องสร้างการเชื่อมต่อสองรายการกับฐานข้อมูลของคุณโดยหนึ่งรายการมี mysql_ และอีกรายการหนึ่งโดยใช้ PDO


1
โอเคฉันค้นหาในไฟล์ php.ini ของฉันและดูเหมือนว่า pdo ในเปิดใช้งานโดยค่าเริ่มต้นฉันยังต้องรู้ว่าฉันสามารถใช้ทั้ง pdo และ mysql_ * handlers ได้หรือไม่ ...
Yuri Scarbaci

1
@ YuriCollector'sEditionRossi อัปเดตคำตอบสำหรับสิ่งนั้น
Jani Hartikainen

1
เป็นมูลค่าการกล่าวขวัญว่าคุณต้องรีสตาร์ท apache ในภายหลังเพื่อให้การเปลี่ยนแปลงมีผล
Adam F

1
@jonaspas หากคุณใช้ Ubuntu ให้ลองอัปเดตด้วยsudo apt-get updateจากนั้นเรียกใช้การติดตั้งดั้งเดิมจากคำตอบ
ryAn_Hdot

14
ขอบคุณ ryAn_Hdot! แต่นั่นก็ไม่ได้ผลสำหรับฉัน วิธีแก้ปัญหาของฉันตอนนี้: ฉันใช้ php7 และฉันต้องทำsudo apt-get install php-mysql
johnnydoe82

25

นั่นเป็นคำถามที่ดี แต่ฉันคิดว่าคุณเข้าใจผิดในสิ่งที่คุณอ่าน

ติดตั้ง PDO

./config --with-pdo-mysqlเป็นสิ่งที่คุณต้องวางอยู่บนเท่านั้นถ้าคุณรวบรวมโค้ด PHP ของคุณเอง หากคุณติดตั้งด้วยตัวจัดการแพ็คเกจคุณเพียงแค่ต้องใช้บรรทัดคำสั่งที่ Jany Hartikainen กำหนด: sudo apt-get install php5-mysqlและsudo apt-get install pdo-mysql

เข้ากันได้กับ mysql_

นอกเหนือจากความจริงที่ว่า mysql_ ท้อแท้แล้วทั้งคู่ยังเป็นอิสระ หากคุณใช้ PDO mysql_ ไม่เกี่ยวข้องและถ้าคุณใช้ mysql_ PDO ก็ไม่จำเป็น

หากคุณปิด PDO โดยไม่เปลี่ยนบรรทัดใด ๆ ในโค้ดของคุณคุณจะไม่มีปัญหา แต่เนื่องจากคุณเริ่มเชื่อมต่อและเขียนแบบสอบถามกับ PDO คุณต้องเก็บไว้และเลิกใช้ mysql_

หลายปีที่ผ่านมาทีมงาน MySQL เผยแพร่สคริปต์เพื่อโยกย้ายไป MySQLi ไม่รู้ว่าแต่งได้ไหม แต่เป็นทางการ


ดังนั้นหากฉันต้องการใช้ทั้งสองอย่างในเวลาเดียวกันฉันจะต้องใช้ทั้งสองวิธีการเชื่อมต่อหรือไม่ สิ่งที่ฉันหมายถึงคือฉันมีเพจ 50 เพจที่ทำงานอยู่แล้วมีโค้ดจำนวนมากต้องใช้เวลาพัฒนาเป็นปีและฉันไม่สามารถย้อนกลับได้แค่ 1 เพจไม่ใช่ตอนนี้อยู่ดี ... สิ่งที่ฉันต้องทำคือ มี 50 หน้าทำงานตามที่เป็นอยู่และหนึ่งหน้านี้ฉันกำลังเขียนโดยใช้ pdo เป็นไปได้หรือไม่? ขอบคุณที่
สละ

การปรับโครงสร้างใหม่อาจมีประโยชน์หากคุณต้องเปลี่ยนรหัสจำนวนมาก แต่ใช่ถ้าคุณต้องการใช้ทั้งสองอย่างคุณต้องสร้างการเชื่อมต่อสองอย่าง
artragis

ทำไมต้อง refactore รหัสของฉันใหม่? ตอนนี้ฉันกำลังทำงานอยู่ฉันไม่ได้เริ่มทำงานด้วยตัวเองมันทำโดยโปรแกรมเมอร์คนอื่นซึ่งไม่ได้ตั้งใจและตอนนี้ฉันต้องปรับตัวให้เข้ากับรหัสของเขา ... มันค่อนข้างรุนแรงเพราะทุกคนมีสไตล์ของตัวเอง ดังนั้นฉันอยากจะปล่อยมันไว้เหมือนตอนนี้เนื่องจากซอฟต์แวร์นี้ถูกใช้มาจนถึงตอนนี้โดยไม่มีปัญหาใด ๆ ... ขอบคุณ btw ^^ ฉันต้องปิดการเชื่อมต่อ mysql ก่อนที่จะเปิด pdo หรือฉันสามารถเปิดทั้งสองได้ที่ เวลาเดียวกัน? ^^
Yuri Scarbaci

1
บางทีคุณอาจใช้ IDE เช่น netbeans หรือ eclipse
artragis

1
ฉันพบสคริปต์ที่อนุญาตให้คุณย้ายไปยัง mysqli และอาจเป็น PDO
artragis

17

โดยพื้นฐานแล้วคำตอบของเจนี่ฮาร์ติเคนคือใช่! ฉันโหวตคำตอบของเขา สิ่งที่ขาดหายไปในระบบของฉัน (อิงตาม Ubuntu 15.04) คือการเปิดใช้งาน PDO Extension ใน php.ini ของฉัน

extension=pdo.so
extension=pdo_mysql.so

รีสตาร์ทเว็บเซิร์ฟเวอร์ (เช่นด้วย "sudo service apache2 restart") -> ทุกอย่างดี :-)

หากต้องการค้นหาตำแหน่งไฟล์ php.ini ที่ใช้งานอยู่ในปัจจุบันคุณสามารถใช้ phpinfo () หรือคำแนะนำอื่น ๆ ได้จากที่นี่: https://www.ostraining.com/blog/coding/phpini-file/


ทำงานให้ฉัน ขอบคุณ. +1
Marcel

1
ฉันไม่มีบรรทัดเหล่านี้ในไฟล์ php.ini ฉันมีเพียงอย่างเดียวextension=pdo_mysql.dllดังนั้นฉันจึงไม่แสดงความคิดเห็นและรีสตาร์ท apache และใช้งานได้
user3494047

@ user3494047 ฉันเดาว่าคุณใช้ระบบ windows ฉันเอา config excample จากระบบ linux แต่เยี่ยมมากที่คุณได้แบ่งปันประสบการณ์ของคุณ!
Tobias Gaertner

จริงๆแล้วมันคือ Ubuntu 14.04
user3494047

ขอบคุณ! ฉันต้องเรียกใช้sudo apt-get install...คำสั่งโหลและไม่มีอะไรทำงานในที่สุดก็เพิ่มสองบรรทัดนี้ใน php.ini ก็ทำ เพียงแค่กล่าวถึงคำสั่งเซิร์ฟเวอร์ Apache sudo service apache2 restartเริ่มต้นใหม่ให้คุณเรียกใช้หลังจากบันทึก: และเส้นทางไฟล์ php.ini ของฉันคือ/etc/php/7.0/apache2/php.ini(ระบบปฏิบัติการ: Lubuntu 16.04 คล้ายกับ Ubuntu เพื่อวัตถุประสงค์เหล่านี้) เรียกใช้sudo gedit <fullpath>เพื่อแก้ไข (gedit หรือ geany หรือโปรแกรมแก้ไขข้อความใด ๆ ในระบบของคุณ)
Nikhil VJ

10

ในตอนแรกให้ติดตั้งชิ้นส่วน PDO ที่จำเป็นโดยรันคำสั่งsudo apt-get install php*-mysqlโดยที่ * เป็นชื่อเวอร์ชันของ php เช่น 5.6, 7.0, 7.1, 7.2 หลังจากการติดตั้งคุณต้องพูดถึง (ไม่ใส่ความคิดเห็นหากมีอยู่แล้ว) ทั้งสองคำสั่ง

extension=pdo.so
extension=pdo_mysql.so

ในไฟล์. ini ของคุณและรีสตาร์ทเซิร์ฟเวอร์ด้วยคำสั่ง

sudo service apache2 restart

คำตอบนี้ไม่ได้เพิ่มข้อมูลใหม่ดังนั้น imo จึงไม่เป็นประโยชน์
Tobias Gaertner

1
คำตอบนี้มีประโยชน์อย่างยิ่งเพราะชี้ให้เห็นว่าคุณต้องการหมายเลขเวอร์ชัน PHP ในphp*-mysql. ฉันพยายามphp-mysqlและphp7-mysqlไม่มีประโยชน์แล้วคำตอบนี้ก็ปิดผนึกข้อตกลง! ขอบคุณ!
jedmao

ทำงานให้ฉัน ขอบคุณ.
Mahir Altınkaya

@ MahirAltınkaya Gald มันช่วย
Avnish alok

8
  1. PDO ย่อมาจาก PHP Data Object
  2. PDO_MYSQL เป็นไดรเวอร์ที่จะใช้อินเทอร์เฟซระหว่าง dataobject (ฐานข้อมูล) และอินพุตผู้ใช้ (เลเยอร์ภายใต้อินเทอร์เฟซผู้ใช้ที่เรียกว่า "code behind") เพื่อเข้าถึงอ็อบเจ็กต์ข้อมูลของคุณฐานข้อมูล MySQL

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

แต่มีความแตกต่างบางประการที่คุณอาจไม่ทราบ

ก่อนอื่นจนถึงตอนนี้คุณอาจเขียนข้อความค้นหาทั้งหมดของคุณในสิ่งที่คล้ายกับ URL และคุณส่งผ่านพารามิเตอร์โดยใช้ URL นั้นเอง การใช้ PDO ทั้งหมดนี้ทำได้ภายใต้ระดับส่วนต่อประสานกับผู้ใช้ อินเทอร์เฟซผู้ใช้ส่งลูกบอลไปยัง PDO ซึ่งนำมันลงสนามและวางลงในฐานข้อมูลสำหรับการสัมผัส 7 จุด .. เขาได้รับเจ็ดคะแนนเพราะเขาไปถึงที่นั่นและทำได้อย่างปลอดภัยมากกว่าการส่งข้อมูลผ่าน URL .

คุณยังสามารถทำให้ไซต์ของคุณแข็งขึ้นด้วยการแทรก SQLโดยใช้ชั้นข้อมูล ด้วยการใช้เลเยอร์ตัวกลางนี้ซึ่งเป็น 'ผู้เล่น' เท่านั้นที่คุยกับฐานข้อมูลฉันแน่ใจว่าคุณจะเห็นว่าสิ่งนี้จะปลอดภัยมากขึ้นได้อย่างไร การเชื่อมต่อกับ datalayer ไปยังฐานข้อมูล datalayer ไปยังฐานข้อมูลไปยัง datalayer กับ interface

และ:

การใช้แนวทางปฏิบัติที่ดีที่สุดในขณะเขียนโค้ดของคุณคุณจะมีความสุขมากขึ้นกับผลลัพธ์ที่ได้

แหล่งข้อมูลเพิ่มเติม:

Re: MySQL Functions ใน url php dot net / manual / en / ref dot pdo-mysql dot php

Re: สถาปัตยกรรมสามชั้น - เพิ่มความปลอดภัยให้แอปพลิเคชันของคุณ https://blog.42.nl/articles/introducing-a-security-layer-in-your-application-architecture/

Re: Object Oriented Design โดยใช้ UML หากคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับเรื่องนี้นี่คือหนังสือที่ดีที่สุดในตลาด Grady Booch เป็นบิดาของ UML http://dl.acm.org/citation.cfm?id=291167&CFID = 241218549 & CFTOKEN = 82813028

หรือตรวจสอบด้วย bitmonkey มีกลุ่มหนึ่งที่ฉันแน่ใจว่าคุณจะได้เรียนรู้มากมายด้วย

>

ถ้าเรารู้ว่าคำศัพท์หมายถึงอะไรจริงๆเราก็ไม่จำเป็นต้องเรียนรู้อะไรเลย

>


0

หากคุณต้องการ CakePHP Docker Container กับ MySQL ฉันได้สร้างอิมเมจ Docker เพื่อจุดประสงค์นั้น! ไม่ต้องกังวลเรื่องการตั้งค่า มันใช้งานได้!

นี่คือวิธีที่ฉันติดตั้งในอิมเมจที่ใช้ Ubuntu:

https://github.com/marcellodesales/php-apache-mysql-4-cakephp-docker/blob/master/Dockerfile#L8

RUN docker-php-ext-install mysql mysqli pdo pdo_mysql

การสร้างและเรียกใช้แอปพลิเคชันของคุณเป็นเพียงกระบวนการ 2 ขั้นตอน (เนื่องจากคุณอยู่ในไดเรกทอรีปัจจุบันของแอป):

$ docker build -t myCakePhpApp .
$ docker run -ti myCakePhpApp

ในกรณีที่ใครก็ตามพยายามทำสิ่งนี้กับคอนเทนเนอร์นักเทียบท่าที่กำลังทำงานอยู่แล้ว: sudo /etc/init.d/apache2 restartจำเป็นต้องรีสตาร์ทเซิร์ฟเวอร์ apache
MajorBreakfast
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.