Перейти к содержимому

Реферальная программа Мегаплана

Выбрать шаблон и создать сайт

1046: No database selected

#1 gaaarfild

gaaarfild
  • Пользователь
  • 596 сообщений
  • Репутация: 0
0

Отправлено 13 Февраль 2009 - 14:11

Не могу создать таблицы в БД, хотя сама БД в этом же скрипте создается. В чем дело? Пишет вот такую ошибку.
1046: No database selected

Вот сам файл соединения с БД.

<?php
$dbhost="localhost"; 
$dbusername="root"; 
$dbuserpassword=""; 
$dbname="otchet"; 

$MYSQL_ERRNO = "";
$MYSQL_ERROR = "";

function db_connect($dbname="") {
	global $dbhost, $dbusername, $dbuserpassword, $dbname;
	global $MYSQL_ERRNO, $MYSQL_ERROR;

	$link_id = mysql_connect($dbhost, $dbusername, $dbuserpassword);
	mysql_query("SET NAMES 'cp1251'");
	if(!$link_id) {
		$MYSQL_ERRNO = 0;
		$MYSQL_ERROR = "Не удалось подключиться к узлу <B>$dbhost.</b>";
		return 0;
	}
	else if(empty($dbname) && !mysql_select_db($dbname)) {
		$MYSQL_ERRNO = mysql_errno();
		$MYSQL_ERROR = mysql_error();
		return 0;
	}
	else return $link_id;
}

function sql_error() {
	global $MYSQL_ERRNO, $MYSQL_ERROR;
	
	if(empty($MYSQL_ERROR)) {
		$MYSQL_ERRNO = mysql_errno();
		$MYSQL_ERROR = mysql_error();
	}
	return "$MYSQL_ERRNO: $MYSQL_ERROR";
}
?>

В самом документе идет вот такое соединение с БД:

include("../connect_db.php");
error_reporting(0);
$link_id = db_connect();
$sql_err = sql_error();
global $sql_err;

$item_data = 'CREATE TABLE `item_data` ('			
		. ' `id` INT(8) NOT NULL AUTO_INCREMENT, '
		. ' `item_name` VARCHAR(50) NOT NULL,'
		. ' `couple` INT(8),'
		. ' `description` VARCHAR(500),'
		. ' PRIMARY KEY (`id`)'
		. ' )';
$table_create = mysql_query($item_data);

В чем моя ошибка, никак не могу понять.

 

 

  • 0

#2 KURT [197BD]

KURT [197BD]
  • Пользователь
  • 31 сообщений
  • Репутация: 0

Отправлено 13 Февраль 2009 - 14:29

у вас параметр функции и глобальная переменная имеют одинаковое название
  • 0

#3 gaaarfild

gaaarfild
    Topic Starter
  • Пользователь
  • 596 сообщений
  • Репутация: 0

Отправлено 13 Февраль 2009 - 14:31

Тоесть так нельзя, да?
  • 0

#4 KURT [197BD]

KURT [197BD]
  • Пользователь
  • 31 сообщений
  • Репутация: 0

Отправлено 13 Февраль 2009 - 15:20

уберите параметр функции для теста
  • 0

#5 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 13 Февраль 2009 - 19:50

gaaarfild, точнее сказать у тебя поступающие значение при вызове функции перекрывает глобальное. Поэтому зачем писать функции, если параметры которые в неё нужно передавать, ты делаешь глобальными?!
Функции для того и существуют, чтобы убрать глобальные переменные в коде, которые добавляют множество ошибок, как у тебя к примеру + улучшить читаемость кода. А ты всё это наоборот нарушаешь.

Пусть даже в конфигурационном файле будут глобальные переменные подключения к БД. Но не надо их делать глобальными в функции, лучше передавать их при вызове через параметры.
Например:
<?php
$dbhost="localhost";
$dbuser="root";
$dbpass="";
$dbname="otchet"; 
............................
function db_connect($db_host, $db_user, $db_pass, $db_name) {
	global $MYSQL_ERRNO, $MYSQL_ERROR;

	$link_id = mysql_connect($db_host, $db_user, $db_pass);
	mysql_query("SET NAMES 'cp1251'");
	if(!$link_id) {
		$MYSQL_ERRNO = 0;
		$MYSQL_ERROR = "Не удалось подключиться к узлу <B>$dbhost.</b>";
		return 0;
	}
	else if(!mysql_select_db($db_name)) {
		$MYSQL_ERRNO = mysql_errno();
		$MYSQL_ERROR = mysql_error();
		return 0;
	}
	else return $link_id;
}
.....................
db_connect($dbhost, $dbuser, $dbpass, $dbname);
?>

  • 0

#6 gaaarfild

gaaarfild
    Topic Starter
  • Пользователь
  • 596 сообщений
  • Репутация: 0

Отправлено 16 Февраль 2009 - 14:39

Все в порядке, спасибо, исправил. Вот еще вопрос. Где тут я ошибся в коде?
Просто хотел написать функцию, которая делает бэкап БД в файл. И так же может обратно загружать то что отбэкаплено.
Когда я загружаю этот файл вот с таким кодом:

INSERT INTO item_data (id, item_name, couple, price, description) VALUES (NULL, `Бур зубной №10`, 14, 10, `Бур, для удаления кариеса. Среднего размера.`), (NULL, `Дренажная трубка`, 8, 83, `Дренаж, для удаления слюны. Полиуретан`);
он не может добавить данные в БД.

if(isset($_POST['openfile'])) {  //Задано условие загрузки файла Backup.
$userfile_name = $_FILES['userfile']['name'];
$fo = fopen($userfile_name, "r");
$file = fread($fo, 300);
fclose($fo);
echo $file;
$load_file = mysql_query($file);
if(!$load_file) die("<BR><span class='err_mess'><i>Не удалось загрузить файл</i> <B>$userfile_name</b>!</span>");
echo "<BR>$userfile_name успешно загружен!";
}

Вот сам блок добавления. И еще вопрос. Как вот в этой стороке

$file = fread($fo, 3000);

Сделать так, чтобы длинна файла задавалась в зависимости от его реальной длины. Тоесть второй параметр чтобы был нестатичный, а меняющийся, для экономии ресурсов.
  • 0

#7 KURT [197BD]

KURT [197BD]
  • Пользователь
  • 31 сообщений
  • Репутация: 0

Отправлено 16 Февраль 2009 - 16:26

$file = fread($fo, filesize($fo));

все названия таблиц и полей в запросе берите в `такие кавычки` а значения (кроме численных) в 'такие кавычки'.
Для теста запустите свой скрипт в майадмине ;)
  • 0

#8 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 16 Февраль 2009 - 21:21

gaaarfild, как уже сказали, надо подучить синтаксис SQL
INSERT INTO item_data (id, item_name, couple, price, description) VALUES (NULL, 'Бур зубной №10', 14, 10, 'Бур, для удаления кариеса. Среднего размера.'), (NULL, 'Дренажная трубка', 8, 83, 'Дренаж, для удаления слюны. Полиуретан');

Также не нужно забывать отслеживать ошибки
.........
mysql_query($file) or die("Ошибка:".mysql_error());
.............

Сделать так, чтобы длинна файла задавалась в зависимости от его реальной длины

Я обычно пользуюсь не бинарным считыванием данных, а построчным file().
Особенно если каждый запрос на новой строке, и написан в одну строку. Хотя если правильнее, то вообще нужно писать обработчик, который будет искать начало запроса и конец(признак ";")
  • 0

#9 gaaarfild

gaaarfild
    Topic Starter
  • Пользователь
  • 596 сообщений
  • Репутация: 0

Отправлено 16 Февраль 2009 - 22:21

И еще, возникла такая проблема. Вот код.
$query_files = mysql_query("SELECT * FROM item_data", $link_id);
$head_bkp = "TRUNCATE TABLE item_data; \r\n ";
$head_bkp .="INSERT INTO item_data (id, item_name, couple, price, description) VALUES";
$fo = fopen($fname, "a+");
fwrite($fo, $head_bkp);

	 while($qd = mysql_fetch_array($query_files)) {
$body_bkp = " \r\n(NULL, '{$qd[item_name]}', {$qd[couple]}, {$qd[price]}, '{$qd[description]}'),";
fwrite($fo, $body_bkp);
}
fclose($fo);

Это блок, который копирует данные из базы в файл. Возникла проблема. Как бы сделать так, чтобы в самом конце он добавил ";" удалив последнюю запятую.
И еще, как бы можно было очистить перед этим таблицу. Truncate table - не работает. Выдает ошибку.
  • 0

#10 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 16 Февраль 2009 - 23:48

gaaarfild,
TRUNCATE TABLE item_data;
Здесь то всё правильно в запросе, но скорее всего проблема в \r\n, обработай строку после считки
$file = str_replace("\r\n", "", $file);

По поводу замены последнего символа strrpos()
$num = strrpos(",", $file);
$file[$num]=";";

  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru