สอบถามปัญหาการส่งค่า array ไปให้ function javascript ในไฟล์ php เดียวกัน และการเรียกใช้ function นี้ทำได้อย่างไรครับ
ผมสร้าง array ชื่อ $a และส่งค่า array $a ไปให้ function init() ใน java script (ไฟล์ php เดียวกัน) เพื่อ plot รูปภาพ tree
1. ไฟล์ของผมเป็นไฟล์ php และในไฟล์นั้นทั้งมี array $a และ function init() ซึงเป็น javascript
2. รบกวนช่วยแนะนำว่าลำดับการทำงานใน php ไฟล์นี้ถูกต้องหรือเปล่าครับ เพราะ run แล้วไม่แสดงผลอะไรเลย
3. ผมคิดว่าตรง <body onload="init();"> น่าจะเป็นตรงที่เรียกใช้ function init() javascript ใช่ไหมครับ
4. ถ้าต้องการให้แสดงข้อความเช่น "Hello World!" ในส่วนของ function init() ที่เป็น javascript ต้องทำอย่างไรครับ ผมใส่ document.write("Hello World!"); ก็ไม่แสดงครับ
Code (PHP)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Spacetree - Tree Animation</title>
//function javascript ใช้สำหรับ plot รูปภาพ tree
<script type="text/javascript">
function init(){
var a = new Array(<?php echo implode(", ", $a);?>);
alert(a.toSource());
};
//จริง ๆ code ที่ plot รูปภาพ tree มีมากกว่านี้นะครับ
function xxx(){};
function yyy(){};
</script>
</head>
<?php
$a = array(1,2,3,4); //array $a ที่สร้างขึ้น
?>
<body onload="init();"> //ใช่ส่วนที่เรียกใช้ function init(); หรือเปล่าครับ
.
.
.
</body>
</html>
ผมควรแก้ไขปัญหาอย่างไรดีครับ ขอบคุณล่วงหน้าสำหรับทุกความเห็นนะครับTag : PHP, HTML/CSS, JavaScript, Ajax, CakePHP, JAVA
Date :
2014-11-22 15:09:14
By :
tommy_13
View :
2510
Reply :
3
ตรงส่วนของ body onload นั่นถูกต้องแล้วครับ เป็นส่วนที่จะเรียกให้ฟังก์ชั่น init() ของ javascript ทำงาน
ส่วนลำดับการทำงาน ตามที่ผมเข้าใจเหมือนมันจะผิดอยู่นิดนึงนะครับ ปกติ interpreter ของ PHP จะทำงานทีละบรรทัด ไล่จากด้านบนลงด้านล่าง ในโค้ดของคุณ มีการสั่ง echo ตัวแปร $a ก่อนที่จะได้รับการประกาศตัวแปร ซึ่งมันดันไปถูกประกาศไว้ข้างล่าง แปลว่า ในบรรทัดที่เขียนว่า
Code (JavaScript)
var a = new Array(<?php echo implode(", ", $a);?>);
ตัวแปร $a จะไม่มีค่าอะไรครับ ทำให้ค่าที่ส่งให้กับฟังก์ชั่น implode() นั่นเป็นค่าว่างๆ ซึ่งทำให้ฟังก์ชั่น implode ทำงานผิดพลาด ถ้าใช้ chrome debug ดู จะเจอ error ประมาณนี้ครับ
Code (JavaScript)
function init(){
//var a = new Array(<br />
<b>Notice</b>: Undefined variable: a in <b>C:\xampp\htdocs\firstapp\test.php</b> on line <b>20</b><br />
<br />
<b>Warning</b>: implode(): Invalid arguments passed in <b>C:\xampp\htdocs\firstapp\test.php</b> on line <b>20</b><br />
""); //ถ้าค่าที่อยู่ใน array $a เป็น string
var a = new Array(<br />
<b>Notice</b>: Undefined variable: a in <b>C:\xampp\htdocs\firstapp\test.php</b> on line <b>21</b><br />
<br />
<b>Warning</b>: implode(): Invalid arguments passed in <b>C:\xampp\htdocs\firstapp\test.php</b> on line <b>21</b><br />
); //ถ้าค่าที่อยู่ใน array $a เป็น string
alert(a);
//document.write(a);
};
วิธีแก้ไขคือ ให้ประกาศตัวแปร $a และใส่ค่าให้มัน ก่อนที่จะเรียกใช้มันครับ คร่าวๆ ก็ประมาณนี้
Code (PHP)
<?php
$a = array(1,2,3,4);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Spacetree - Tree Animation</title>
<script type="text/javascript">
function init(){
//var a = new Array(<?php echo '"'. implode('", "', $a); echo '"'; ?>); //ถ้าค่าที่อยู่ใน array $a เป็น string
var a = new Array(<?php echo implode(', ', $a); ?>); //ถ้าค่าที่อยู่ใน array $a เป็น int
alert(a);
//document.write(a);
};
</script>
</head>
<body onload="init();">
</body>
</html>
นิดนึงครับ เมื่อเขียนภาษา html, javascript และ php ปนๆ กันอย่างนี้ เราต้องมองให้ออกนะครับ ว่าแต่ละภาษา มีการมองตัวแปรแบบไหน เช่นตรงบรรทัดที่ ประกาศ new Array ของ javascript ถ้าหาก ค่าที่อยู่ใน array $a เป็น string เช่น $a = array("mango", "banana", "melon") แบบนี้ พอผ่าน implode แล้วตัว javascript จะมองเห็นเป็น
Code (JavaScript)
var a = new Array(mango, banana, melon);
ซึ่งผิดนะครับ เพราะ ค่าที่อยู่ใน Array มันควรจะเป็นสตริง แต่ที่เห็น javascript จะเข้าใจว่า mango, banana, melon เป็นชื่อตัวแปร ของ javascript ทั้งหมด ซึ่งค่าที่ควรเป็นจริงๆ มันควรจะเป็นแบบนี้ครับ
Code (JavaScript)
var a = new Array("mango, "banana"," melon");
ฉะนั้น ตอน implode ควรเพิ่ม " เข้าไปปิดหัวปิดท้ายให้ดีครับ แต่ถ้าหากเป็น Integer อยู่แล้ว จาวาจะเข้าใจได้ จึงไม่จำเป็นต้องใส่ "
ลองเอาไปรันดูแล้วกันครับ ผิดถูกอย่างไร รอผู้รู้ท่านอื่นมาแก้ไขนะครับ
ปล. ฟังก์ชั่น toSource() ผมไม่ทำงานนะ ผมเลยตัดออก
ประวัติการแก้ไข 2014-11-22 17:19:21
Date :
2014-11-22 17:17:50
By :
Ray
ในการแปลงค่าจาก PHP ให้เป็น JavaScript ใช้ JSON จะง่ายและดีที่สุดครับ
Code (PHP)
<?php
$a = array(1,2,3,4); // ย้ายมาอยู่ตรงนี้
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Spacetree - Tree Animation</title>
//function javascript ใช้สำหรับ plot รูปภาพ tree
<script type="text/javascript">
function init(){
//var a = new Array(<?php echo implode(", ", $a);?>);
// เพราะถ้ากำหนด $a หลังตรงนี้ $a จะยังไม่มีค่าอะไร และจะ error (Undefined variable: a)
var a = <?php json_encode($a) ?>; // จะได้ [1,2,3,4]
alert(a.toSource());
};
//จริง ๆ code ที่ plot รูปภาพ tree มีมากกว่านี้นะครับ
function xxx(){};
function yyy(){};
</script>
</head>
<?php
//$a = array(1,2,3,4); //array $a ที่สร้างขึ้น ให้ย้ายไปข้างบน
?>
<body onload="init();"> //ใช่ส่วนที่เรียกใช้ function init(); หรือเปล่าครับ
.
.
.
</body>
</html>
Date :
2014-11-22 17:42:51
By :
phpinfo()
ขอบคุณท่าน Ray และ ท่าน phpinfo() ที่สละเวลาให้คำแนะนำเดี๋ยวผมจะลองทำตามนะครับ
ถ้าได้ผลอย่างไรจะมาแจ้งให้ทราบนะครับ
ขอบคุณมากครับ
Date :
2014-11-22 21:58:40
By :
tommy_13
Load balance : Server 04