Задавайте вопросы, мы ответим
Вы не зашли.
Привет, ПРОграммерам)
Вобщем в чем соль: полтора года юзал Денвер, но вот недавно понадобилось самостоятельно поставить связку пых+мускул+апаче. На первый взгляд все получилось. Компоненты взаимодействуют. НО. Все что я могу сделать MySQL - это создавать таблици. Ни читать данные, ни записывать неполучается. Подскажите, в какую сторону копать, чтоб добится результата?
Надеюсь на помощ, а то работа стоИт, пока не решу проблему.
Спасибо заранее.
Неактивен
А в чем заключается «не получается»?
Неактивен
Не выдает никаких ошибок либо предупреждений. Банально НЕ РЕАГИРУЕТ вообще никак. Лишь создаются таблици, остальные манипуляции будто закоментированы.
Неактивен
А у вас в php точно стоит вывод ошибок на экран? каков уровень предупреждений?
В Денвере-то все отстроено максимально изначально, а вот по умолчанию вроде апач все в лог кидает, а не на экран :-))).
В-скрипте попробуйте поставить
ini_set('display_errors', '1'); // Максимальная диагностика
error_reporting(E_ALL); // и вся на экран
ну и всю работу с mysql попробуйте на ошибки проверять примерно по тому принципу, который приведен в конце http://sqlinfo.ru/forum/viewtopic.php?id=2401. По порядку - создание таблицы, вставка туда записей, выборка
Неактивен
Спасибо за отклик.
Я прошелся по пунктам, стало немного легче, но все же...
1) Подключение к базе происходит (это и так было ясно)
2) Таблицы создаются
3) Записи считываются (заносил через PhpMyAdmin)
4) Записи не вносятся (А именно INSERT и UPDATE)
Отредактированно Djumpen (23.03.2010 02:47:04)
Неактивен
1.Для отладки вставьте функцию mysql_error после "подозрительного" INSERTa ->
mysql_query("INSERT INTO test (name, user_id) VALUES ('test_name',' ');");
echo mysql_errno() . ": " . mysql_error();
Что пишет?
2. После mysql_select_db('test');
Напишите
mysql_query("SET NAMES cp1251");
mysql_query("SET CHARACTER SET cp1251");
Закорючки(вопросики) остались?
Если да ,
то как Вы заносили эти данные
1) переносили со старого сервера
2) вводили в phpmyadmin
3) другой вариант
От этого зависит решение 2-й проблемы
Неактивен
1) Обогатился ошибкой при добавлении echo mysql_errno() . ": " . mysql_error();
а именно: 1366: Incorrect string value: '\xE8\xEC\xFF' for column 'name' at row 1
2) При добавлении mysql_query("SET NAMES cp1251"); mysql_query("SET CHARACTER SET cp1251"); кодировка исправилась. Теперь при каждом подключении так задавать кодировку?
Жду дальнейших указаний по пункту 1.
Неактивен
1) Таблица тестовая - данных не жалко?
Выполняем очистку в phpmyadmin:
TRUNCATE TABLE test
или из php
mysql_query("TRUNCATE TABLE test");
Повторяем скрипт - ошибка осталась?
если да, пишем в phpmyadmin SHOW CREATE TABLE test;
Что выдает?
2) Да можно так и писать при подключении - не вдаваясь в детали. Потом можно глянуть подробнее - кажется здесь в FAQ есть.
Отредактированно mekong (23.03.2010 03:54:04)
Неактивен
Свершилось! Можно сказать - я счастлив
В чем оказывается проблема: при выполнении INSERT`a скрипт не позволял задавать даже пустое значение для автоинкрементного поля. Тоесть поле user_id было именно такое и я задавал INSERT INTO test (name, user_id) VALUES ('Имя','');
При работе с денвером проблем не возникало, а вот сдесь.. Вобщем благодарен за уделенное время!
Напоследок хотел спросить о структуре БД. Проэктирую что то по типу мини-соц.сети. При регистрации пользователю выдается id. Логин/пароль хранятся в отдельной таблице. А сообщения, список друзей, настройки и т.д. планирую хранить так: для каждого пользователя создаются свои таблици "friends_".$id , "message_".$id , "settings_".$id
Подскажите, правильный ли такой подход? Или можна поступить мудрее?
Неактивен
1) да, в случае Вашего автоинкремента нужно писать INSERT INTO test (name) VALUES ('Имя');
2) КАТЕГОРИЧЕСКИ неправильно!
заводить для каждого юзера свою таблицу неправильно ни с точки зрения SQL, ни с точки зрения возможных ограничений.
Нужно делать примерно так (в очень общем виде например для сообщений)
таблица Messages
==============
message_id (уник. номер сообщения, автоинкремент)
message_date (дата сообщения)
message_from_id (id юзера1 - от кого)
message_to_id (id юзера2 - кому)
message_text
Djumpen написал:
Свершилось! Можно сказать - я счастлив
В чем оказывается проблема: при выполнении INSERT`a скрипт не позволял задавать даже пустое значение для автоинкрементного поля. Тоесть поле user_id было именно такое и я задавал INSERT INTO test (name, user_id) VALUES ('Имя','');
При работе с денвером проблем не возникало, а вот сдесь.. Вобщем благодарен за уделенное время!
Напоследок хотел спросить о структуре БД. Проэктирую что то по типу мини-соц.сети. При регистрации пользователю выдается id. Логин/пароль хранятся в отдельной таблице. А сообщения, список друзей, настройки и т.д. планирую хранить так: для каждого пользователя создаются свои таблици "friends_".$id , "message_".$id , "settings_".$id
Подскажите, правильный ли такой подход? Или можна поступить мудрее?
Неактивен
Ну а если в таблице наберется (в приоритете) сотни тысяч сообщений. Удобно ли будет делать выборку для каждого пользователя? С точки зрения быстродействия.
Неактивен
Нужно сразу строить индексы по полям message_from_id и message_to_id. И выборка будет работать быстро при сотнях тысячах. При еще больших объемах нужно учитывать множество дополнительных нюансов при проектировании базы и оптимизации MySQL.
Если Вы заведете таблицы сообщений, друзей, настроек и т д на каждого пользователя, то при большом количестве пользователей можно столкнуться например с ограничением на максимальное число одновременно открытых файлов.
В общем для того, чтобы использовать Ваш подход, нужно иметь серьезные аргументы, почему лучше делать так, а не более классически :-)
Неактивен
Ок, пойду переписывать свое творение
А насчет индексов по полям message_*_id если честно, немного не понял. Как их строить и главное - как они помогут в дальнейшем. Сори за облако вопросов. Слишком долго розбирался сам, вот решил все выплеснуть
Неактивен
Djumpen написал:
А насчет индексов по полям message_*_id если честно, немного не понял. Как их строить и главное - как они помогут в дальнейшем.
Или сразу при создании таблицы CREATE TABLE ... INDEX(message_from_id)...
Или позже ALTER TABLE `имя таблицы` ADD INDEX(message_from_id); (http://sqlinfo.ru/articles/info/12.html)
По поводу ?????? вместо русского текста см FAQ п3 - очень понятно описывается суть проблемы.
Неактивен