2013-05-28 2 views
-1
$table_name=strval($new_username).'_msgs'; 

@ $db=new mysqli('localhost','root','','newdatabase'); 

$query2="CREATE TABLE ? ('msg_id' int(20) auto_increment primary key,'sender'    varchar(50), 'content' varchar(2000), 'date' varchar(50))"; 

      $stmt2=$db->prepare($query2); 
      $stmt2->bind_param("s",$table_name); 
      $stmt2->execute(); 

Это дает сообщение об ошибке «вызов функции члена bind_param() на не-объект»Невозможно создать таблицу в PHP

+0

удалить @ из 2-й линии и посмотреть, хорошо ли соединение. – Robert

+2

Asa side note, используя @ в вашем коде - это не очень хорошая идея. –

+1

Почему вы динамически создаете новые таблицы, чтобы начать с?!?! One В этом вопросе так много ошибок на стольких уровнях; чем дольше вы смотрите ... – deceze

ответ

4

Вы можете просто добавить поле «в», например, и вы можете напишите имя получателя вместо создания новой таблицы для каждого пользователя. Это плохая практика.

сделать новое поле, как

`receiver` varchar(50) 

и вы можете получить его сообщения с запросом, как это:

SELECT * FROM `msgs` WHERE `receiver`='random_username' 
+0

будет ли делать запрос на длительное время для загрузки, когда количество пользователей не увеличивается? .. Например, у нас есть 100 пользователей, каждый из которых имеет 5000 msgs ... Я хотел создать новую таблицу для каждого пользователя, чтобы их сообщения сохраняться отдельно, а запрос будет быстрее. – user2427230

+0

@user Используйте ** индексы **. Правильно проиндексированная база данных может обрабатывать 100 * 5000 строк, даже не разбивая пота. – deceze

+0

Существуют базы данных с несколькими миллионами строк, и запрос выполняется за несколько миллисекунд. – Deepsy

0

Ваша ошибка говорит, что $stmt не действует

Это потому, что ваш запрос не готовится из-за неправильного синтаксиса и неправильного использования заполнителя.

Удалить кавычки имен столбцов в таблице создание

$query2="CREATE TABLE ? (`msg_id` int(20) auto_increment primary key, 
         `sender` varchar(50), 
         `content` varchar(2000), 
         `date` varchar(50) 
         )"; 

вы всегда можете отлаживать, если заявление подготовлено или не используя

$stmt2=$db->prepare($query2) or die($db->error); 

Вы можете прийти, чтобы узнать об ошибке.

См обучающая here

Это было как раз вы говорите отлаживать трюк .. В фактический вы не можете использовать заполнители для имен таблиц и идентификаторов ..

см this tag

Как было предложено @ Deepsy .. Я также согласен с тем, что это плохая практика. Это создаст количество таблиц в вашей базе данных, которые могут выполняться только с одной таблицей

+0

Почему downvote Пожалуйста, добавьте комментарий .. – alwaysLearn

+0

По-прежнему отсутствует самая большая проблема с неправильно используемым заполнителем. – deceze

+0

@deceze Спасибо, что указали это. Выучил одну новую вещь :). Я не помню ни слова, но я должен знать причину, поэтому я могу исправить себя – alwaysLearn

0

Посмотрите это

<?php 
$mysqli = new mysqli(DB_SERVER,DB_USER,DB_PASS,DB_NAME); 

if($mysqli->connect_errno) echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error; 
echo $mysqli->host_info . "\n"; 

$query = "CREATE TABLE hwt_tools(
    id mediumint(8) NOT NULL AUTO_INCREMENT, 
    user_id mediumint(8), 
    category_id mediumint(8), 
    target_url varchar(255), 
    favicon_url varchar(255), 
    desc_text text, 
    UNIQUE KEY id (id) 
);"; 

//Use this to safely create a table while testing 
if(!$mysqli->query($query)) echo "Table creation failed: (" . $mysqli->errno . ") " . $mysqli->error; 

//Use this to drop existing table and start a new 
//if(!$mysqli->query("DROP TABLE IF EXISTS hwt_tools") || !$mysqli->query($query)) echo "Table creation failed: (" . $mysqli->errno . ") " . $mysqli->error; 

?> 
Смежные вопросы