X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

Открыть тему
Тема закрыта
> 1046: No database selected
gaaarfild
gaaarfild
Topic Starter сообщение 13.2.2009, 15:11; Ответить: gaaarfild
Сообщение #1


Не могу создать таблицы в БД, хотя сама БД в этом же скрипте создается. В чем дело? Пишет вот такую ошибку.
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
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
KURT [197BD]
KURT [197BD]
сообщение 13.2.2009, 15:29; Ответить: KURT [197BD]
Сообщение #2


у вас параметр функции и глобальная переменная имеют одинаковое название
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
gaaarfild
gaaarfild
Topic Starter сообщение 13.2.2009, 15:31; Ответить: gaaarfild
Сообщение #3


Тоесть так нельзя, да?
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
KURT [197BD]
KURT [197BD]
сообщение 13.2.2009, 16:20; Ответить: KURT [197BD]
Сообщение #4


уберите параметр функции для теста
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ZiTosS
ZiTosS
сообщение 13.2.2009, 20:50; Ответить: ZiTosS
Сообщение #5


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);
?>
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
gaaarfild
gaaarfild
Topic Starter сообщение 16.2.2009, 15:39; Ответить: gaaarfild
Сообщение #6


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

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);

Сделать так, чтобы длинна файла задавалась в зависимости от его реальной длины. Тоесть второй параметр чтобы был нестатичный, а меняющийся, для экономии ресурсов.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
KURT [197BD]
KURT [197BD]
сообщение 16.2.2009, 17:26; Ответить: KURT [197BD]
Сообщение #7


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


все названия таблиц и полей в запросе берите в `такие кавычки` а значения (кроме численных) в 'такие кавычки'.
Для теста запустите свой скрипт в майадмине ;)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ZiTosS
ZiTosS
сообщение 16.2.2009, 22:21; Ответить: ZiTosS
Сообщение #8


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().
Особенно если каждый запрос на новой строке, и написан в одну строку. Хотя если правильнее, то вообще нужно писать обработчик, который будет искать начало запроса и конец(признак ";")
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
gaaarfild
gaaarfild
Topic Starter сообщение 16.2.2009, 23:21; Ответить: gaaarfild
Сообщение #9


И еще, возникла такая проблема. Вот код.
$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 - не работает. Выдает ошибку.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ZiTosS
ZiTosS
сообщение 17.2.2009, 0:48; Ответить: ZiTosS
Сообщение #10


gaaarfild,
TRUNCATE TABLE item_data;

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


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


Замечание модератора:
Эта тема была закрыта автоматически ввиду отсутствия активности в ней на протяжении 100+ дней.
Если Вы считаете ее актуальной и хотите оставить сообщение, то воспользуйтесь кнопкой
или обратитесь к любому из модераторов.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


 



RSS Текстовая версия Сейчас: 19.4.2024, 20:35
Дизайн