เกิด error Notice: Array ... , Notice: Undefined... , Fatal error: Call to a member เพราะผิดพลาดตรงไหนบ้างครับ
มันขึ้น error แบบนี้ครับ
0
Notice: Array to string conversion in C:\xampp\htdocs\paypoint\testpage\funtion\data.php on line 43
Notice: Array to string conversion in C:\xampp\htdocs\paypoint\testpage\funtion\data.php on line 43
Notice: Undefined variable: mysqli in C:\xampp\htdocs\paypoint\testpage\funtion\data.php on line 48
Fatal error: Call to a member function query() on null in C:\xampp\htdocs\paypoint\testpage\funtion\data.php on line 48
อันนี้เป็นโค้ดครับ
data.php
Code (PHP)
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Untitled Document</title>
</head>
<body>
<?php
class connectDB
{
private $_host = "localhost";
private $_pass = "";
private $_user = "root";
private $_db = "mammon";
private function openDB()
{
error_reporting(E_ALL);
$charset = "set names utf8";
$mysqli = new mysqli("$this->_host","$this->_user","$this->_pass","$this->_db");
echo mysqli_connect_errno();
if(mysqli_connect_errno())
{
echo "can't connect database";
exit();
}
}
private function closeDB()
{
error_reporting(E_ALL);
mysqli_close();
}
public function Insert($Table,$ArrCl,$ArrInf,$Id)
{
self::openDB();
error_reporting(E_ALL);
$volue = count($ArrCl);
if($Id='*')
{
$sql = "INSERT INTO '".$Table."' ('".$ArrCl."')VALUES('".$ArrInf."')";
}else
{
$sql = "INSERT INTO '".$Table."' ('".$ArrCl."')VALUES('".$ArrInf."') WHERE '00_Id'= '".$Id."'";
}
$mq = $mysqli->query($sql);
self::closeDB();
}
}
?>
</body>
</html>
form.php
Code (PHP)
<?php
require "../funtion/data.php";
//test
$EE = $_REQUEST['EE'];
$PP = $_REQUEST['PP'];
$conn = new connectDB;
if($EE)
{
$Ai = array($EE,$PP);
$Ac = array('e','p');
$In = $conn->Insert('test',$Ac,$Ai,'*');
if($In)
{
echo "ข้อมูลเรียบร้อย";
}else{
echo"เกิดข้อผิดพลาด";
}
}else{
echo "ไม่มีข้อมูล";
}
?>
test.php
Code (PHP)
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Untitled Document</title>
<?php ?>
</head>
<body>
<form action="testpage/page/form.php" method="post" enctype="multipart/form-data">
<input name="EE" type="text">
<input name="PP" type="text">
<input name="ww" type="submit">
</form>
</body>
</html>
มันผิดพลาดตรงไหนครับ เพราะตอนผมเทส openDB ก็รันได้(แต่ตอนนั้นมไม่ได้ใส่ privateนะครับ)แต่พอมาทำต่อก็เป็นแบบนี้หละครับTag : PHP, MySQL
ประวัติการแก้ไข 2015-12-06 11:55:18 2015-12-06 12:09:30
Date :
2015-12-05 18:03:25
By :
satsukode
View :
1982
Reply :
6
private แล้วจะเรียกจากไฟล์นอกคลาสได้ยังไงครับ
คุณลองทำความเข้าใจเรื่อง public protected private เสียก่อนดีกว่า
แล้วใน error มันแจ้งบรรทัดอะไรมาแล้ว ทำไมคุณไม่ก๊อปหรือไฮไลท์บรรทัดนั้นด้วยอะครับ เพราะผมมองแบบนี้ก็หาไม่เจอว่าบรรทัดปัญหาที่ว่านั้นมันอันไหนแน่?
bb code [ php ] ก็มี ก็ลองใช้ดูด้วยครับ โค้ดที่เอามาให้คนช่วยคนอื่นจะได้อ่านง่ายขึ้น
ประวัติการแก้ไข 2015-12-06 10:23:31
Date :
2015-12-06 10:20:22
By :
mr.v
แก้แล้วนะครับ ขอโทษด้วยนะครับที่ตอนแรกอ่านยาก
ส่วนที่บอกว่าเป็น เพราะ private ผมไม่แน่ใจนะครับ เพราะตัวที่เป็น private เช่น openDB host use ทั้งหมดผมให้มันทำงานอยู่แต่ใน class อยู่แล้ว จะไม่ให้ฟังชั่นนอก class มาเกี่ยวข้องเลย ส่วนฟังชั่นที่อยู่ใน class เดียวกัน แต่ต้องถูกเรียกใช้จากที่อื่นเช่นพวก insert delete select ผมให้เป็น public หมดนะครับ เหมือนตัวที่เป็น private เป็นแค่ตัวที่สนับสนุน public ไม่รู้ว่าผมเข้าใจถูกหรือป่าวครับ
ขอบคุณทุกคำแนะนำครับ
ประวัติการแก้ไข 2015-12-06 12:28:22
Date :
2015-12-06 11:58:44
By :
satsukode
จากไฟล์ form.php
Code (PHP)
$Ai = array($EE,$PP);
$Ac = array('e','p');
$In = $conn->Insert('test',$Ac,$Ai,'*');
มันไปเรียก method insert ซึ่งใน argument ที่ 2 และ 3 คุณกำหนดตรงนี้เป็น array()
array($EE, $PP); และ array('e', 'p');
ในขณะที่ภายใน method insert()
Code (PHP)
public function Insert($Table,$ArrCl,$ArrInf,$Id)
{
self::openDB();
error_reporting(E_ALL);
$volue = count($ArrCl);
if($Id='*') {
$sql = "INSERT INTO '".$Table."' ('".$ArrCl."')VALUES('".$ArrInf."')";
} else {
$sql = "INSERT INTO '".$Table."' ('".$ArrCl."')VALUES('".$ArrInf."') WHERE '00_Id'= '".$Id."'";
}
$mq = $mysqli->query($sql);
self::closeDB();
}
argument หรือ parameter ที่สองและสาม $ArrCi, $ArrInf คุณเอาไปต่อสตริงซะเฉยๆ ทั้งๆที่มันรับมาน่าจะเป็น array อ่านจากชื่อตัวแปรแล้วก็น่าจะเป็น array แต่ดันต่อสตริง มันจึงทำไม่ได้ มันจึงแจ้งว่า Quote: Notice: Array to string conversion
คุณต้องหาวิธี loop array ออกมาก่อนเพื่อใช้ต่อ string ถ้าจะทำแบบนั้นนะครับ
ส่วน Quote: Notice: Undefined variable: mysqli
เนื่องมาจากว่าใน method เดียวกันนี้ จู่ๆคุณก็เรียกใช้ $mysqli โดยหาที่มาไม่ได้ มันจึงขึ้น
แต่จากที่ดู คุณคงต้องการใช้ $mysqli จาก method openDB() ดังนั้นตัวแปร $mysqli จึงควรถูกส่งต่อข้าม method ได้ด้วยการกำหนดลงไปยัง property
ตัวอย่าง
Code (PHP)
class ConnectDb
{
public $mysqli;
private function openDB()
{
$this->mysqli = new mysqli();
}
public function insert()
{
$mq = $this->mysqli->query($sql);
}
}
ผมย่อยตัวอย่างให้เหลือน้อยๆเฉพาะที่เกี่ยวกับ $mysqli แล้วคุณลองทำความเข้าใจดูนะครับ.
Date :
2015-12-06 12:43:11
By :
mr.v
เฉพาะส่วน insert() ถ้าการกำหนดค่า array name ตัวหนึ่ง value อีกตัวหนึ่ง แบบนั้นอาจจะเกิดการพลาดได้
ผมคิดว่าน่าจะลองแบบนี้
Code (PHP)
$insert_name_value = array(
'e' => $EE,
'p' => $PP,
);
คือกำหนด key เป็น field name => value เป็น field value ไปแล้วเวลาเช็คมันจะพลาดยากกว่า.
การเรียกใช้ก็เปลี่ยนนิดหน่อย ถ้าจะทำอย่างของผม
Code (PHP)
public function insert($table, array $field_value, $id)
{
$fields = array_keys($field_value);
$values = array_values($field_value);
// build sql insert string.
$sql = 'INSERT INTO `'.$table.'`';
$sql .= ' ('.implode(',', $fields).')';
$sql .= ' VALUES';
$sql .= ' ('.implode(',', $values).')';
if ($id != '*') {
$sql .= ' WHERE 00_Id = '.$id;
}
// clear junk
unset($fields, $values);
}
Date :
2015-12-06 12:59:12
By :
mr.v
เฮ!!! ได้แล้วครับ ขอบคุณครับ แต่มันมีปัญหากับ
Warning: mysqli_close() expects exactly 1 parameter, 0 given in C:\xampp\htdocs\paypoint\testpage\funtion\data.php
คิดว่าน่าจะเป็นที่ mysqli_close() นิดหน่อย เดี๋ยวผมลองหาทางแก้เองก่อน แต่แจ้งเตือนเดิมหมดแล้วครับ ขอบคุณมากครับ
Date :
2015-12-06 15:00:53
By :
satsukode
class ที่ทำเดิม ถูกต้องแล้วครับ ผิดที่ ต่อ string เอา array มาต่อ ห้วนๆ โดยไม่มีการแปลงให้เป็น string ก่อน
คำสั่งการแปลง string ก็จากที่ mr.v ทำให้ดูนั่นแหล่ะครับ
ส่วน mysqli_close() ต้องการ 1 parameter ซึ่งก็คือตัวแปร สีแดงนี้ $mysqli = new mysqli(....)
ก็ให้ประกาศเป็น private เอาไว้
private $cnx_id;
และเมื่อประกาศเป็น oop ก็ควรเรียกใช้ แบบ oop ไปเลยครับ อย่าเรียกใช้ผสม ระหว่าง procedural code กับ oop ครับ
จะสับสนเอานะครับ
วิธีการเรียกใช้แบบ oop
$this->cnx_id = new mysqli(....) or die ( $this->cnx_id->error);
$this->cnx_id->close();
วิธีเรียกใช้แบบ procedural code
$this->cnx_id = mysqli_connect( ..... ) or die ( msyqli_connect_error());
mysqli_close($this->cnx_id);
ปล. ดูปักหมุดไว้ก็ได้ครับ
ประวัติการแก้ไข 2015-12-06 16:41:24
Date :
2015-12-06 16:40:37
By :
NewbiePHP
Load balance : Server 02