PFZ.nl - PHP Community: [CI] Backup database terugzetten - Frameworks - Forum - PFZ.nl - PHP Community

Je kunt niet antwoorden op dit topic
#1 02-02-2012 14:56
  • Ramon88
  • Groep: Forumleden
  • Posts: 28
  • Actief sinds: 18-10-2010
Via
1
$this->dbutil->backup();
maak ik een .sql bestand van de huidige database. Ik wil op een later punt echter ook ervoor zorgen dat ik via CodeIgniter zelf deze backup kan terugzetten. Via load->file het bestand ingelezen (als $sql) en uitgevoerd via $this->db->query($sql), geeft me echter een "MySQL server has gone away" error..

Het volgende geeft me ook een error na een klein stukje. De code:
1
2
3
foreach (explode(';', $sql) as $query) { //execute the exploded text content
                    $this->db->query($query);
                }


De error:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Error Number: 1064

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''

Hello {{ user:first_name }},

\r\n
Thank you for registering at' at line 1

INSERT INTO default_email_templates (`id`, `slug`, `name`, `description`, `subject`, `body`, `lang`, `is_default`) VALUES (4, 'activation', 'Activation Email', 'The email which contains the activation code that is sent to a new user', '{{ settings:site_name }} - Account Activation', '

Hello {{ user:first_name }},

\r\n
Thank you for registering at {{ settings:site_name }}. Before we can activate your account, please complete the registration process by clicking on the following link:

\r\n
{{ url:site }}users/activate/{{ user:id }}/{{ activation_code }}

\r\n


Neem dus aan dat de brackets een probleem vormen? Hoe kan dit opgelost worden..?

#2 02-02-2012 15:12
Server has gone away betekent doorgaans dat de query die je stuurt te groot is.

Quote

Het volgende geeft me ook een error na een klein stukje. De code:
DA's logisch, puntkomma's komen niet alleen voor tussen twee queries in, zet kunnen overal staan waar iemand een puntkomma in de tekst geeft staan.

Backups maken en terugzetten is, vooral bij MySQL, iets wat eigenlijk alleen MySQL zelf met enige betrouwbaarheid kan doen. mysql_dump om de dumps te maken, en de mysql commandline on ze terug te zetten.

Wat je vannuit je applicatie beter kunt doen is de *data* dumpen. Maak een SQL bestand van alleen de structuur, en dump de data b.v. in CSV of XML formaat zodat je de data kunt inlezen en in normale queries kunt gieten om weer op te slaan. Dat is en hoop werk, dus ik zou voor mysql_dump gaan en het idee dat je het vanuit CI kunt doen gewoon laten varen. :-)
DELETE FROM world WHERE dbms='mysql';
http://www.yapf.net - http://yapf.blogspot.com/

#3 02-02-2012 15:49
  • Ramon88
  • Groep: Forumleden
  • Posts: 28
  • Actief sinds: 18-10-2010
Had gehoopt dat er op een of andere manier toch iets was om de query op te delen. Via nl2br() krijg ik wel een clean iets terug. Wou eigenlijk via Codeigniter zelf dit laten regelen, op een of andere manier. Dit boven het in PHPMyAdmin te doen (gemak dient de mens toch?). Had wel gedacht dat hier iets op te verzinnen valt. Het is namelijk zo dat CodeIgniter struikelt over het feit dat het meerdere SQL statements tegelijk zijn. Eerst drop, dan create, dan insert etc.

#4 02-02-2012 18:04

Quote

Had gehoopt dat er op een of andere manier toch iets was om de query op te delen.
Niet op een manier die je zelf "even" maakt. Denk aan een query als

SELECT "SELECT \"\\";\\"\";";

filter daar de juiste ; maar eens uit.

Quote

Via nl2br() krijg ik wel een clean iets terug.
nee, je krijgt HTML terug, wat *gegarandeerd* niet is wat je wilt.

Het lijkt mij dat CI hier gewoon faalt en wel iets kan wegschrijve maar niet kan laden. Een bijzonder typisch probleem bij routines die proberen slimmer te zijn dan de makers van de database.
DELETE FROM world WHERE dbms='mysql';
http://www.yapf.net - http://yapf.blogspot.com/

#5 02-02-2012 20:28
  • Ramon88
  • Groep: Forumleden
  • Posts: 28
  • Actief sinds: 18-10-2010
Het is een door CI gemaakte query, dus een SELECT "SELECT \"\\";\\"\";"; zal er niet uitkomen. Via omwegen heb ik wel, een niet al te mooie, oplossing gevonden. Het blijkt echter dat hij op een of ander icoon vast blijft hangen. In de database is dit een à, via het inspecteren van de "html" is het een à en op het scherm toont een driehoekje met een vraagteken. Als ik dit eenmaal opgelost heb, dan heb ik het geheel klaar. Ik weet echter niet hoe ik dit oplos?

1
Incorrect string value: '\xC3 votr...'

Geeft hij als waarschuwing. Het is dus wat voor votre staat dat een à is.

#6 02-02-2012 20:48

Quote

Het is een door CI gemaakte query, dus een SELECT "SELECT \"\\";\\"\";"; zal er niet uitkomen.
Je mist het punt, je kunt niet zomaaar herkennen welke puntkomma bij de query hoort en welke onderdeel van de inhoud van de query is, omdat de hele string alle tekens kan bevatten die ook door SQL worden gebruikt.

m.a.w. als jij in je website een tekst tikt die een puntkomma bevat dan heb je al een probleem. Dat CI de queries maakt verandert daar helemaal niets aan. Effectief zul je de queries moeten parsen en moeten controleren of alle quotes die zijn geopend ook weer zin gesloten voordagt je bij de puntkomma bent. Enters tellen niet mee (en mag je niet converteren) en ge-escapte quotes moet je ook negeren, ook als ze meervoudig ge-escapet zijn...

Quote

Het blijkt echter dat hij op een of ander icoon vast blijft hangen. In de database is dit een à, via het inspecteren van de "html" is het een à en op het scherm toont een driehoekje met een vraagteken. Als ik dit eenmaal opgelost heb, dan heb ik het geheel klaar. Ik weet echter niet hoe ik dit oplos?
Dat klinkt alsof je UTF-8 tekst zit te verwerken als latin-1. utf8 is double-byte voor somige tekens, daarvoor moet je ofwel de mb_* functies van PHP gebruiken, of de boel omzetten naar latin1
DELETE FROM world WHERE dbms='mysql';
http://www.yapf.net - http://yapf.blogspot.com/

#7 03-02-2012 20:18
  • Boyd Pappot
  • Groep: PFZ.nl Web Developers
  • Posts: 423
  • Actief sinds: 19-12-2003
Neem het nu aan van ons: het maken van een oplossing voor het dumpen en restoren van databases anders dan de tools van MySQL zelf is gedoemd om te falen.
Nu is het een charset ding, dan een FK probleem, en dan een "MySQL server has gone away" omdat een pakketje te groot is.
Je kan natuurlijk ook vanuit PHP mysqldump en -import uitvoeren met exec() of system(). Dan heb je toch je PHP implementatie, maar dan met veilige data.


Inloggen wachtwoord vergeten? Aanmelden