Register Register Member Login Member Login Member Login Forgot Password ??
PHP , ASP , ASP.NET, VB.NET, C#, Java , jQuery , Android , iOS , Windows Phone
 

Registered : 109,037

HOME > PHP > PHP Forum > สอบถามการใช้ mysql_real_escape_string ทีครับ มันไม่ยอมใส่ \ ให้



 

สอบถามการใช้ mysql_real_escape_string ทีครับ มันไม่ยอมใส่ \ ให้

 



Topic : 099463



โพสกระทู้ ( 402 )
บทความ ( 0 )



สถานะออฟไลน์
Facebook



จากบทความนี้: เลิกใช้ฟังก์ชั่น mysql_xxxxx() ที่ล้าสมัย (deprecated) และเปลี่ยนมาใช้ MySQLi กันดีกว่า

Code (PHP)
// สร้างคลาสขึ้นมาใหม่โดยขยายคลาส MySQLi
class ExtendedMySQLi extends MySQLi
{

    public function __construct($host, $username, $password, $dbname)
    {
        // เราจำเป็นต้องเรียก constructor ของคลาสแม่ทุกครั้ง เพื่อให้คลาสลูกทำงานได้อย่างถูกต้อง
        parent::__construct($host, $username, $password, $dbname);
    }

    // ประกาศ method ใหม่ที่เราต้องการ
    // โดยในที่นี่เราจะสร้าง method ที่สามารถแทนที่ตัวแปรที่ผ่านการ escape แล้วลงใน query
    // และส่ง query ให้ MySQL Server ในคราวเดียว
    public function queryf($query)
    {
        // ตัวแปรพิเศษที่จะทำให้การทำงานเร็วขึืน ใช้เพื่อเติมเต็ม array ที่จะส่งไปให้ vsprintf
        // จะได้ไม่เกิด error ในกรณีที่ผู้ใช้กำหนดตัวแปรน้อยกว่าจำนวนตัวแทนที่ใน $query
        static $fill = array(
            null, null, null, null, null, null, null, null, null, null,
            null, null, null, null, null, null, null, null, null, null,
            null, null, null, null, null, null, null, null, null, null,
            null, null, null, null, null, null, null, null, null, null,
            null, null, null, null, null, null, null, null, null, null,
        );
        // escape ตัวแปรทุกตัว
        foreach (array_slice(func_get_args(), 1) as $arg) {
            $args[] = $this->real_escape_string($arg);
        }
        return isset($args)
            // หากมีตัวแปรส่งมา ก็ให้เรียกใช้ vsprintf() เพื่อแทนที่ค่าตัวแปรลงใน query
            ? $this->query(vsprintf($query, $args + $fill))
            // นอกนั้นก็ query ตามปกติ
            : $this->query($query);
    }

}

$mysqli = new ExtendedMySQLi('localhost', 'root', '', 'testdb');
$result = $mysqli->queryf("SELECT '%s'", "Cookie's cat");
$row = $result->fetch_row();
echo $row[0];


พอดีว่าผมต้องกลับไปใช้ mysql เพราะเซิฟเวอร์เค้าปิด mysqli ผมเลยเอาฟังก์ชันนี้เข้าไปใช้ในคลาสแทน
แต่ติดปัญหาตรงที่การใช้ mysql_real_escape_string ครับ ผมเอาฟังก์ชันจากที่อื่นมาใช้อีกอันคือ
Code (PHP)
public function clean($str){
		$str = @trim($str);
		if(get_magic_quotes_gpc()){
			$str = stripslashes($str);
		}
        return mysql_real_escape_string($str);
	}


แล้วตอนที่ escape ตัวแปร ผมก็ใช้แบบนี้
Code (PHP)
foreach (array_slice(func_get_args(), 1) as $arg) {
            $args[] = $this->clean($arg);
        }


แต่มันยังไม่ใส่ \ ให้นะครับ เป็นเพราะตอนที่ตัดพารามิเตอร์หรือปล่าวครับ
ตัวแปร $arg
ช่วยดูให้ทีครับ ขอบคุณครับ



Tag : PHP, MySQL









ประวัติการแก้ไข
2013-08-22 15:29:56
Move To Hilight (Stock) 
Send To Friend.Bookmark.
Date : 2013-08-22 15:27:31 By : fogza View : 2585 Reply : 15
 

 

No. 1



โพสกระทู้ ( 74,058 )
บทความ ( 838 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Twitter Facebook

เดียวขอคุณแมวมาตอบให้ครับ






แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-08-22 16:59:00 By : mr.win
 


 

No. 2



โพสกระทู้ ( 1,819 )
บทความ ( 20 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Facebook

เอาโค้ดที่คุณปรับเปลี่ยนมาดูทั้งคลาสเลยครับ เพราะว่าอาจจะผิดตรงอื่นผิดหรือเปล่า
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-08-22 17:04:22 By : phpinfo
 

 

No. 3



โพสกระทู้ ( 402 )
บทความ ( 0 )



สถานะออฟไลน์
Facebook

ตามนี้ครับ
คลาส db นี้ผมดูจากพี่ บัณฑิต แสนคำอีกทีครับ
class_db.inc.php
<?php
class clssDB {
	private $rs;
	private $_fetch_assoc = array();

	public function __construct($host, $root, $password, $dbname)
	{
		$conn = mysql_connect($host,$root,$password) or die(mysql_error());
		mysql_query("SET NAMES utf8",$conn);
		mysql_select_db($dbname);
	}

	public function clean($str){
		$str = @trim($str);
		if(get_magic_quotes_gpc()){
			$str = stripslashes($str);
		}
        return mysql_real_escape_string($str);
	}

	public function query($query)
    {
        // ตัวแปรพิเศษที่จะทำให้การทำงานเร็วขึืน ใช้เพื่อเติมเต็ม array ที่จะส่งไปให้ vsprintf
        // จะได้ไม่เกิด error ในกรณีที่ผู้ใช้กำหนดตัวแปรน้อยกว่าจำนวนตัวแทนที่ใน $query
        static $fill = array(
            null, null, null, null, null, null, null, null, null, null,
            null, null, null, null, null, null, null, null, null, null,
            null, null, null, null, null, null, null, null, null, null,
            null, null, null, null, null, null, null, null, null, null,
            null, null, null, null, null, null, null, null, null, null,
        );
        // escape ตัวแปรทุกตัว
        foreach (array_slice(func_get_args(), 1) as $arg) {
            $args[] = $this->clean($arg);
        }
        return isset($args)
            // หากมีตัวแปรส่งมา ก็ให้เรียกใช้ vsprintf() เพื่อแทนที่ค่าตัวแปรลงใน query
            ? $this->rs = mysql_query(vsprintf($query, $args + $fill))
            // นอกนั้นก็ query ตามปกติ
            : $this->rs = mysql_query($query);
    }

    public function num_rows()
    {
        if (empty($this->rs)) {
            return false;
        } else {
            $data = mysql_num_rows($this->rs);
        }
        return $data;
    	//return mysql_num_rows($this->rs);
    }

    public function fetch_assoc()
    {      
    	if (empty($this->rs)) {
            return false;
        } else {
            $data = mysql_fetch_assoc($this->rs);
        }
        return $data;
    }

    public function fetch_all_assoc()
    {
    	if(count($this->_fetch_assoc)>0)
    	{
    		return $this->_fetch_assoc;
    	}
    	else
    	{
    		while($row = mysql_fetch_assoc($this->rs))
	    	{
	    		$this->_fetch_assoc[] = $row;
	    	}
	    	return $this->_fetch_assoc;
    	}    	
    }

    public function last_id() {
        if ($id = mysql_insert_id()) {
            return $id;
        } else {
            return false;
        }
    }

    function __destruct()
    {
    	mysql_close();
    }
}
?>


ตรง
Code (PHP)
public function clean($str){
		$str = @trim($str);
		if(get_magic_quotes_gpc()){
			$str = stripslashes($str);
		}
        return mysql_real_escape_string($str);
	}

มันไม่ยอมใส่ \ ให้นะครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-08-22 17:43:03 By : fogza
 


 

No. 4



โพสกระทู้ ( 1,819 )
บทความ ( 20 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Facebook

เท่าที่ดูโค้ดก็ไม่ได้ผิดอะไร
แต่ที่มันไม่ยอมใส่ \ ให้เพราะยังไม่ได้ connect กับฐานข้อมูลหรือเปล่าครับ (แต่ดูจากโค้ด ก็น่าจะเชื่อมต่อแล้ว)
เพราะว่า mysql_real_escape_string() จะทำงานได้นั้น ต้องการการเชื่อมต่อกับฐานข้อมูลครับ
และขึ้นอยู่กับ setting ของ MySQL Server ด้วยว่าตั้งรูปแบบของการ escape ไว้อย่างไร
ซึ่งแม้จะไม่ใส่ \ แต่ก็อาจจะใส่ '' ให้ครับ ซึ่งเป็นการ escape เหมือนกัน
ตรงนี้แหละที่ทำให้ mysql_escape_string() กับ mysql_real_escape_string() นั้นต่างกัน
เพราะตัวแรกไม่สนใจ config ของเซิร์ฟเวอร์และจะใส่ \ ตลอด แต่ตัวหลังต้องเชื่อมต่อกับเซิร์ฟเวอร์เพื่อใช้รูปแบบการ escape ตามเซิร์ฟเวอร์

เสริมให้นิดนึงนะครับ ตรงฟังก์ชั่น clean() ไม่จำเป็นต้องใช้ @ operator กับ trim() ครับ ไม่มีประโยชน์เลย และทำให้ช้าลงเสียเปล่าๆ

$str = trim($str);

เฉยๆ ก็พอครับ

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-08-22 17:55:57 By : phpinfo
 


 

No. 5



โพสกระทู้ ( 402 )
บทความ ( 0 )



สถานะออฟไลน์
Facebook

ตอบความคิดเห็นที่ : 4 เขียนโดย : phpinfo เมื่อวันที่ 2013-08-22 17:55:57
รายละเอียดของการตอบ ::
ผมลองใช้ทั้ง mysql_escape_string() และ mysql_real_escape_string() แล้ว ก็ยังไม่ได้ครับ
แต่ใช้ mysql_real_escape_string($_POST[...]); ตรงๆ แบบนี้ได้ครับ มึนแฮะ - -"

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-08-23 12:36:50 By : fogza
 


 

No. 6



โพสกระทู้ ( 1,819 )
บทความ ( 20 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Facebook

งงมากครับ มันก็ควรจะทำงานได้ปกติ ตอนนี้เหลือสาเหตุเดียวแล้ว
ตอนเรียกใช้ ได้แทนที่ %s ลงใน query หรือเปล่าครับ

// %s จะเปลี่ยนเป็น Cookie\'s cat
$db->query(" SELECT '%s' ", "Cookie's cat");


แบบนี้ไม่ได้นะครับ
$db->query(" SELECT '$a' ");

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-08-23 13:44:33 By : phpinfo()
 


 

No. 7



โพสกระทู้ ( 402 )
บทความ ( 0 )



สถานะออฟไลน์
Facebook

ตอบความคิดเห็นที่ : 6 เขียนโดย : phpinfo() เมื่อวันที่ 2013-08-23 13:44:33
รายละเอียดของการตอบ ::
ผมก็เรียกตามแบบแรกอยู่แล้วนะครับ

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-08-23 14:35:42 By : fogza
 


 

No. 8



โพสกระทู้ ( 1,819 )
บทความ ( 20 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Facebook

งั้นก็ไม่ทราบแล้วล่ะครับว่าเป็นเพราะอะไร เพราะดูแล้วมันไม่มีอะไรผิดน่ะครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-08-23 14:44:06 By : phpinfo()
 


 

No. 9



โพสกระทู้ ( 1,819 )
บทความ ( 20 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Facebook

หรือลองเปลี่ยนส่วน query() เป็นแบบนี้ดูครับ
	public function query($query)
    {
        // ตัวแปรพิเศษที่จะทำให้การทำงานเร็วขึืน ใช้เพื่อเติมเต็ม array ที่จะส่งไปให้ vsprintf
        // จะได้ไม่เกิด error ในกรณีที่ผู้ใช้กำหนดตัวแปรน้อยกว่าจำนวนตัวแทนที่ใน $query
        static $fill = array(
            null, null, null, null, null, null, null, null, null, null,
            null, null, null, null, null, null, null, null, null, null,
            null, null, null, null, null, null, null, null, null, null,
            null, null, null, null, null, null, null, null, null, null,
            null, null, null, null, null, null, null, null, null, null,
        );
        $args = array($query);
        // escape ตัวแปรทุกตัว
        foreach (array_slice(func_get_args(), 1) as $arg) {
            $args[] = $this->clean($arg);
        }
        return $this->rs = mysql_query(call_user_func_array('sprintf', $args + $fill));
    }


แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-08-23 14:55:09 By : phpinfo()
 


 

No. 10



โพสกระทู้ ( 402 )
บทความ ( 0 )



สถานะออฟไลน์
Facebook

ตอบความคิดเห็นที่ : 9 เขียนโดย : phpinfo() เมื่อวันที่ 2013-08-23 14:55:09
รายละเอียดของการตอบ ::
ยังไม่ได้ครับ ขนาดผมลองแบบนี้
Code (PHP)
foreach (array_slice(func_get_args(), 1) as $arg) {
           $args[] = mysql_escape_string($arg);
       }

เอาตรงๆ แบบนี้ยังไมได้

foreach (array_slice(func_get_args(), 1) as $arg)
พอจะเขียนแบบอื่นได้ไหมเอ่ย

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-08-23 15:20:44 By : fogza
 


 

No. 11



โพสกระทู้ ( 1,819 )
บทความ ( 20 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Facebook

ผมพอจะนึกสาเหตุออกแล้ว คุณใช้ PHP เวอร์ชั่นไหนครับ 5.2 ต้นๆ หรือต่ำกว่าใช่หรือเปล่าครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-08-23 15:22:33 By : phpinfo()
 


 

No. 12



โพสกระทู้ ( 1,819 )
บทความ ( 20 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Facebook

สาเหตุคือ func_get_args() ครับ มันไม่สามารถใช้เป็น argument ของฟังก์ชั่นได้ใน PHP5.2 หรือต่ำกว่า
จะต้องให้ค่าลงในตัวแปรชั่วคราวก่อน แล้วค่อยนำไปใช้
ขอบคุณที่แจ้งมานะครับ จะได้เอาไปแก้ในบทความด้วย


แก้เป็นแบบนี้ครับ
    public function query($query)
    {
        // ตัวแปรพิเศษที่จะทำให้การทำงานเร็วขึืน ใช้เพื่อเติมเต็ม array ที่จะส่งไปให้ vsprintf
        // จะได้ไม่เกิด error ในกรณีที่ผู้ใช้กำหนดตัวแปรน้อยกว่าจำนวนตัวแทนที่ใน $query
        static $fill = array(
            null, null, null, null, null, null, null, null, null, null,
            null, null, null, null, null, null, null, null, null, null,
            null, null, null, null, null, null, null, null, null, null,
            null, null, null, null, null, null, null, null, null, null,
            null, null, null, null, null, null, null, null, null, null,
        );
        // escape ตัวแปรทุกตัว
        $tmp = func_get_args(); // ใส่ลงในตัวแปรชั่วคราวก่อน
        foreach (array_slice($tmp, 1) as $arg) { // แล้วจึงนำไปใช้เป็น argument ของ array_slice()
            $args[] = $this->clean($arg);
        }
        return isset($args)
            // หากมีตัวแปรส่งมา ก็ให้เรียกใช้ vsprintf() เพื่อแทนที่ค่าตัวแปรลงใน query
            ? $this->rs = mysql_query(vsprintf($query, $args + $fill))
            // นอกนั้นก็ query ตามปกติ
            : $this->rs = mysql_query($query);
    }


แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-08-23 15:29:10 By : phpinfo()
 


 

No. 13



โพสกระทู้ ( 402 )
บทความ ( 0 )



สถานะออฟไลน์
Facebook

ตอบความคิดเห็นที่ : 12 เขียนโดย : phpinfo() เมื่อวันที่ 2013-08-23 15:29:10
รายละเอียดของการตอบ ::
ผมใช้ PHP 5.5.1 นะครับ เดี๋ยวขอลองไปแก้ลูป foreach แล้วจะมาบอกอีกทีครับ

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-08-23 15:47:48 By : fogza
 


 

No. 14



โพสกระทู้ ( 1,819 )
บทความ ( 20 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Facebook

เอิ่ม ใช้ php5.5.1 มันใช้ mysql ธรรมดาได้เหรอครับ เพราะ 5.5 มันตัด mysql ธรรมดาทิ้งไปแล้วนะครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-08-23 16:05:48 By : phpinfo()
 


 

No. 15



โพสกระทู้ ( 402 )
บทความ ( 0 )



สถานะออฟไลน์
Facebook

ตอบความคิดเห็นที่ : 14 เขียนโดย : phpinfo() เมื่อวันที่ 2013-08-23 16:05:48
รายละเอียดของการตอบ ::
หรอครับ แต่ผมใช้ mysql อยู่นะ ไม่ติดอะไรนะครับ insert update delete ได้ครับ

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-08-23 16:34:31 By : fogza
 

   

ค้นหาข้อมูล


   
 

แสดงความคิดเห็น
Re : สอบถามการใช้ mysql_real_escape_string ทีครับ มันไม่ยอมใส่ \ ให้
 
 
รายละเอียด
 
ตัวหนา ตัวเอียง ตัวขีดเส้นใต้ ตัวมีขีดกลาง| ตัวเรืองแสง ตัวมีเงา ตัวอักษรวิ่ง| จัดย่อหน้าอิสระ จัดย่อหน้าชิดซ้าย จัดย่อหน้ากึ่งกลาง จัดย่อหน้าชิดขวา| เส้นขวาง| ขนาดตัวอักษร แบบตัวอักษร
ใส่แฟลช ใส่รูป ใส่ไฮเปอร์ลิ้งค์ ใส่อีเมล์ ใส่ลิ้งค์ FTP| ใส่แถวของตาราง ใส่คอลัมน์ตาราง| ตัวยก ตัวห้อย ตัวพิมพ์ดีด| ใส่โค้ด ใส่การอ้างถึงคำพูด| ใส่ลีสต์
smiley for :lol: smiley for :ken: smiley for :D smiley for :) smiley for ;) smiley for :eek: smiley for :geek: smiley for :roll: smiley for :erm: smiley for :cool: smiley for :blank: smiley for :idea: smiley for :ehh: smiley for :aargh: smiley for :evil:
Insert PHP Code
Insert ASP Code
Insert VB.NET Code Insert C#.NET Code Insert JavaScript Code Insert C#.NET Code
Insert Java Code
Insert Android Code
Insert Objective-C Code
Insert XML Code
Insert SQL Code
Insert Code
เพื่อความเรียบร้อยของข้อความ ควรจัดรูปแบบให้พอดีกับขนาดของหน้าจอ เพื่อง่ายต่อการอ่านและสบายตา และตรวจสอบภาษาไทยให้ถูกต้อง

อัพโหลดแทรกรูปภาพ

Notice

เพื่อความปลอดภัยของเว็บบอร์ด ไม่อนุญาติให้แทรก แท็ก [img]....[/img] โดยการอัพโหลดไฟล์รูปจากที่อื่น เช่นเว็บไซต์ ฟรีอัพโหลดต่าง ๆ
อัพโหลดแทรกรูปภาพ ให้ใช้บริการอัพโหลดไฟล์ของไทยครีเอท และตัดรูปภาพให้พอดีกับสกรีน เพื่อความโหลดเร็วและไฟล์ไม่ถูกลบทิ้ง

   
  เพื่อความปลอดภัยและการตรวจสอบ กระทู้ที่แทรกไฟล์อัพโหลดไฟล์จากที่อื่น อาจจะถูกลบทิ้ง
 
โดย
อีเมล์
บวกค่าให้ถูก
<= ตัวเลขฮินดูอารบิก เช่น 123 (หรือล็อกอินเข้าระบบสมาชิกเพื่อไม่ต้องกรอก)







Exchange: นำเข้าสินค้าจากจีน, Taobao, เฟอร์นิเจอร์, ของพรีเมี่ยม, ร่ม, ปากกา, power bank, แฟลชไดร์ฟ, กระบอกน้ำ

Load balance : Server 04
ThaiCreate.Com Logo
© www.ThaiCreate.Com. 2003-2024 All Rights Reserved.
ไทยครีเอทบริการ จัดทำดูแลแก้ไข Web Application ทุกรูปแบบ (PHP, .Net Application, VB.Net, C#)
[Conditions Privacy Statement] ติดต่อโฆษณา 081-987-6107 อัตราราคา คลิกที่นี่