Posts Tagged ‘ php

[PHP]Unable to load dynamic library “php_mcrypt.dll”

มีโอกาสได้ใช้งาน module mcrypt ใน PHP พอเปิดใช้งานแล้วลอง start Apache ดูแต่ก็ยังใช้ไม่ได้ เปิดดู log เจอ error ดังนี้

PHP Warning:  PHP Startup: Unable to load dynamic library 'D:\\AppServer\\AppServ\\php5\\ext\\php_mcrypt.dll' - The specified module could not be found.\r\n in Unknown on line 0

วิธีการแก้ไขปัญหา ให้ copy libmcrypt.dll ไปวางใน folder bin ของ Apache จากนั้นทำการ restart Apache ก็สามารถใช้งาน mcrypt ได้แล้ว

[PHP] ปัญหา Cannot send session cache limiter headers already sent

เนื่องจากเวลาทำเว็บ PHP มักนิยม encoding ด้วย UTF-8 เสมอไม่เคยเจอปัญหา เพิ่งจะมาเจอก็ตอนเปลี่ยนมาใช้ Notepad++ ในการเขียน PHP แทน Adobe Dreamweaver เพราะไม่ค่อยได้ใช้ในการ Design แค่ Code อย่างเดียว ปัญหาที่เจอเคือการใช้งาน Session ดังนี้

<?php
session_start();
echo "Session Start...";
?>

ดูผ่านๆ ไม่น่ามีปัญหาอะไร แต่เจอ Errorแบบนี้

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at xxx) in xxx

ก็หน้ามืดไปเกือบ ชั่วโมงได้ สุดท้ายพบว่าเป็นที่ Notepad++ เนื่องจาก Default Encoding ผมกำหนดเป็น UTF-8 ดังรูป
php-utf8-encoding-problem
ตัว Notepad++ เพิ่มข้อความอะไรสักอย่างในไฟล์ ดังนี้ (เปิดจากไฟล์ปกติจะไม่เจอ ที่เจอเนื่องจากลองใช้ Java อ่านข้อมูลออกมา)

๏ปฟ<?php
session_start();
echo "Session Start...";
?>

ทำให้เกิด error ดังกล่าว วิธีแก้ไขให้ บันทึกรูปแบบ Encoding เป็น Encoding UTF-8 Without BOM ดังรูป
php-utf8-encoding-problem
หวังว่าคนที่เจอปัญหาเดียวกันจะได้แก้ไขได้ถูกทางครับ
เพิ่มเติม 08-02-2011 : เพื่อนที่ทำงานแนะนำว่าให้เพิ่ม ob_start(); ในบรรทัดแรกก็แก้ปัญหาได้เหมือนกัน

[PHP] Upload รูปลง Oracle

มีงานที่ต้องใช้ PHP ทำการ Upload รูปลงไปเก็บใน Database Oracle 10G ซึ่งผมไม่ค่อยชอบงานแบบนี้เลย แต่ก็ค้นหาจาก อ.google ได้ หนทางสว่างมาประมาณนี้

$conn = oci_connect("user", "password", "host");
//Create oracle lob descriptor 
$lob = oci_new_descriptor($conn, OCI_D_LOB);
$sql = "INSERT INTO TEST(ID, NAME, IMG) VALUES('1','XX', EMPTY_BLOB()) RETURNING IMG INTO :FILE_DATA";
//Create Statement
$stmt = oci_parse($conn, $sql);
//Bind blob return data
oci_bind_by_name($stmt, ":FILE_DATA", $lob, -1, OCI_B_BLOB);

//Exceute insert
$rc = oci_execute($stmt, OCI_DEFAULT);
if($rc){
	//function $lob->savefile(...) reads from the uploaded file. to binay save to db
	if ($lob->savefile($_FILES['FILE_IMG']['tmp_name'])) {
		//Commit transaction
		oci_commit($conn);
	}else{
		//Rollback transaction
		oci_rollback($conn);
	}
}else{
	//Rollback transaction
	oci_rollback($conn);
}

//Close resource
oci_free_descriptor($lob);
oci_free_statement($stmt);
oci_close($conn);

หมายเหตุ : ใช้ได้ทั้งรูป ไฟล์ครับ สำหรับ CLOB ก็ไม่น่าจะแตกต่างจากนี้
แหล่งข้อมูล
Working with LOBs in Oracle and PHP
PHP Oracle FAQ

[PHP] PDO For MySQL #1

ปกติสมัยที่ทำเว็บเล่นๆทำไปเรื่อย การติดต่อฐานข้อมูลก็ใช้ Library ของ mysql โดยตรง แต่หลังๆ ความขี้เกียจในการเปลี่ยนแปลง Code ในส่วนของ DAO (Data Access Object) ก็เข้าครอบงำทำให้ต้องหาเครื่องมือ หรือ Lib มาช่วย งานซึ่งก็ได้พบเจอกับ PDO อ่านผ่านๆ และทดลองตามขั้นตอนดังนี้
1. เปิด PDO Library เปิด php.ini แล้วเปิด comment

extension=php_pdo.dll
extension=php_pdo_mysql.dll

2. Restart Apache
3. เขียน Code ทดสอบดังนี้

//Create connection
$conn = new PDO('mysql:host=localhost;dbname=xx', 'user', 'password');
//Query
$datas = $conn->query("SELECT * FROM TB_NAME");
foreach($datas as $row) {
	echo $row['ID']." : ".$row['NAME']."<br/>";
}
//Close connection
$conn = null;

หลังจากทดลองง่ายๆ ได้สองสามนาที คาดหวังว่ามันจะ workสำหรับงานชิ้นต่อไป
ป.ล คาดหวังอีกครั้งว่าใน hosting ทั้งหลายควรเปิดใช้ PDO ด้วยนะครับ

PHP : การใช้งาน stripslashes เมื่อต้องการ “\”

พอดีเจอปัญหาในการทำ Application ตัวหนึ่้งเวลากรอกข้อมูลจากหน้าเว็บ ที่เป็น ฟอร์ม แล้วมีการกรอกตัวอักษร ดังนี้ (อาจมีมากกว่านี้)

"", '', \ 

เวลารับค่าผ่าน การ $_POST หรือ $_GET ระบบจะใส่เครื่องหมาย “\” มาให้อัตโนมัติ จริงๆ เป็นเรื่องที่ดีัี แต่เวลาบันทึกลงฐานข้อมูลก็จะได้เครื่องหมาย “\” ไปด้วย พอดึงข้อมูลมาแสดง ก็จะแสดงไม่ถูกต้อง เช่นเรากรอกข้อมูล

I'm PHP I don't like "" and '' and \

จะถูกแปลงไปเป็น

I\'m PHP I don\'t like \"\" and \'\' and \\

ซึ่งตอนบันทึกก็จะทำการบันทึกข้อมูลแบบนี้ลงไปเลย แล้วเวลาดึงข้อมูลมาแสดงก็จะได้ ข้อมูลแบบนี้มาแสดง โดยเฉพาะถ้ามีการแก้ไข ข้อมูลก็จะยิ่งเติมเครื่องหมาย “\” เข้าไปอีก ตอนแรกจะแก้ปัญหาด้วย htmlentities หรือ htmlspecialchars แต่ว่าใช้ไม่ได้ผล ก็เลยลงเอยด้วย function stripslashes

ข้อมูลจาก
stripslashes
htmlentities
htmlspecialchars