#php #mysql #database #insert
#php #mysql — сервер #База данных #вставить #mysql
Вопрос:
Я использовал этот класс:
<?
class DbConnector {
var $theQuery;
var $link;
function DbConnector() {
$host = 'localhost';
$db = 'my_db';
$user = 'root';
$pass = 'password';
// connect to the db
$this->link = mysql_connect($host, $user, $pass);
mysql_select_db($db);
register_shutdown_function(array(amp;$this, 'close'));
}
function find($query) {
$ret = mysql_query($query, $this->link);
if (mysql_num_rows($ret) == 0)
return array();
$retArray = array();
while ($row = mysql_fetch_array($ret))
$retArray[] = $row;
return $retArray;
}
function insert($query) {
$ret = mysql_query($query, $this->link);
if (mysql_affected_rows() < 1)
return false;
return true;
}
function query($query) {
$this->theQuery = $query;
return mysql_query($query, $this->link);
}
// get some results
function fetchArray($result) {
return mysql_fetch_array($result);
}
function close() {
mysql_close($this->link);
}
function exists($query) {
$ret = mysql_query($query, $this->link);
if (mysql_num_rows($ret) == 0)
return false;
}
function last_id($query) {
return mysql_insert_id($query);
}
}
?>
Который я использую для множества запросов, и он работает нормально, хотя я пытаюсь вставить, используя этот запрос:
global $db;
$query = $db->insert("INSERT INTO `submissions` (
`id` ,
`quote` ,
`filename` ,
`date_added` ,
`uploaded_ip`
)
VALUES (
NULL , '{$quote}', '{$filename}', NOW(), '{$_SERVER['REMOTE_ADDR']}')
");
И это выдает мне эту ошибку:
Not Found
The requested URL /horh_new/id/<br /><b>Fatal error</b>: Call to a member function insert() on a non-object in <b>/Applications/MAMP/htdocs/horh_new/addit.php</b> on line <b>52</b><br /> was not found on this server.
Хотя, когда я не использую этот класс выше, а использую это вместо:
$con = mysql_connect("localhost","root","password");
if (!$con) {
die('Could not connect: ' . mysql_error());
}
mysql_select_db("my_db", $con);
mysql_query("INSERT INTO `submissions` (
`id` ,
`quote` ,
`filename` ,
`date_added` ,
`uploaded_ip`
)
VALUES (
NULL , '{$quote}', '{$filename}', NOW(), '{$_SERVER['REMOTE_ADDR']}')
");
echo mysql_insert_id();
mysql_close($con);
Это работает нормально. Кто-нибудь может сказать мне, что не так с моим классом? Я был бы действительно признателен.
Комментарии:
1. Ну, исходя из этой ошибки, я бы сказал, что $ db — это не то, что вы ожидаете. Удалите его, и что вы видите?
2. Ваша переменная $ db не была создана там, где вы получаете эту ошибку.
Ответ №1:
Вы должны сделать как
global $db;
$db = new DbConnector();
Или лучший способ использовать это
добавьте статическую функцию класса DbConnector, которая будет создавать только один экземпляр на протяжении всего запроса
public static function getInstance(){
static $instance = null;
if($instance === null){
$instance = new DbConnector();
}
return $instance;
}
И используйте этот класс как
$db = DbConnector::getInstance();
$db->insert($query);
Комментарии:
1. итак,
$db = DbConnector::getInstance();
в основном просто проверяет, был ли создан экземпляр или еще нет? Спасибо за быструю помощь!2. это создаст новый экземпляр, если он не был создан, в противном случае он вернет старый экземпляр. И еще кое-что в подобных ситуациях __constructor не должен быть общедоступным.
Ответ №2:
вам необходимо создать экземпляр объекта перед его использованием
$db = new DbConnetor();
теперь вы можете выполнить вставку
хотя я предлагаю сначала добавить метод __construct для подключения к базе данных
class DbConnector {
public function __construct() {
// connect to db here
}
Ответ №3:
Вы уверены, что $ db содержит экземпляр вашего класса? Может быть, просто выполните var_dump () из $ db непосредственно перед вызовом $ db-> insert() и посмотрите, установлено ли оно.