Import souboru *.sql – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Import souboru *.sql – PHP – Fórum – Programujte.comImport souboru *.sql – PHP – Fórum – Programujte.com

 

Sigurd
~ Anonymní uživatel
8 příspěvků
8. 10. 2015   #1
-
0
-

Dobrý den,
potřebuji importovat zálohu do DB.  Záloha je ve sql tvaru.

Používám tento kód ale ikdyž mi na konci vypíše, že vše proběhlo DB je pořád nezměněná.
 

 <?php
$filename = 'moje_zaloha.sql';
$mysql_host = 'host';$mysql_username = 'root';$mysql_password = '123456';$mysql_database = 'dump';
mysql_connect($mysql_host, $mysql_username, $mysql_password) or die('Chyba v připojení : MySQL server: ' . mysql_error());
mysql_select_db($mysql_database) or die('Chyba ve vybrání DB: ' . mysql_error());
$templine = '';
$lines = file($filename);
foreach ($lines as $line)
 {
if (substr($line, 0, 2) == '--' || $line == '')
   continue;
$templine .= $line;
if (substr(trim($line), -1, 1) == ';'){
    mysql_query($templine) or print('Chyba ve vkládání QUERY příkazu \'<strong>' . $templine . '\': ' . mysql_error() . '<br /><br />');
    $templine = '';
}
}
echo "Záloha vpořádku importována";
?>
Nahlásit jako SPAM
IP: 90.182.180.–
Kit+15
Guru
8. 10. 2015   #2
-
0
-

#1 Sigurd
Správně má být spíš 

$mysql_host = 'localhost';

Ten print máš úplně špatně. Spočítej si apostrofy.

Proč si to nenahraješ jedním příkazem? 

$templine = file_get_contents($filename);

Ve chvíli, kdy na konci řádku najdeš hledaný ";", tak si celé dílo smažeš. To jsi asi nechtěl.

Nikde nevidím ten import dat, ani jeho náznak.

Nahlásit jako SPAM
IP: 194.228.13.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
peter
~ Anonymní uživatel
4014 příspěvků
9. 10. 2015   #3
-
0
-

Kit: Mozna to mezitim spravil. Ted tam mysql_query je, pak teprve templine smaze.

if (substr(trim($line), -1, 1) == ';'){
    mysql_query($templine) or print('Chyba ve vkládání QUERY příkazu \'<strong>' . $templine . '\': ' . mysql_error() . '<br /><br />');
    $templine = '';
}

Kazdopadne, mas pravdu, ze vubec neresi pripad, kdy muze byt na konci radku rozdeleny text, napr
toto je text;
toto je novy radek textu


Sigurd - Moc by pomohlo, kdyby jsi pridal vzorovy soubor, treba 5 radku.

Nahlásit jako SPAM
IP: 2001:718:2601:258:413b:94...–
Kit+15
Guru
9. 10. 2015   #4
-
0
-
Nahlásit jako SPAM
IP: 194.228.13.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
peter
~ Anonymní uživatel
4014 příspěvků
9. 10. 2015   #5
-
0
-

OT
Kit:  Promin, ale tve pindy na mysql funkce jsou spatne. Ty funkce spravne funguji. Kdezdo pdo jsou naprosto nedodelane, neintuitivni. Sesmolene na kolene. Jedine, co je tam jako vylepseni je pouze to, ze to umi prepisovat promenne do sql prikazu. Jinak je to hnus, fujka. Treba odchytavat chybove stavy. Prosel sql dotaz, ano, ne? S jakou chybou? Prosel sql dotaz a vratil vysledek 0 radku, 1 radek, vice radku? Prosel sql dotaz mazani radku ano, ne? Kolik smazal radku?

 Tohle je muj pokus udelat si nejakou univerzalni knihovnu.

<?php
class classSql
{
public $conn  = null;
//public $db    = null;
public $sth = null;
public $sth_exec = null;
private $cfg = null;
//private $log = null;

	function __construct($params)
	{
	$this->createConfig($params);
	$this->connect();
	$this->query("SET NAMES utf8");
//	$this->log = array(
//		'logdate'=>'logdate',
//		'loguser'=>'loguser'
//		);
	}

	function __destruct()
	{
	$this->disconnect();
	}

	function createConfig($params)
	{
	$cfg = array(
		'host'  => '',
		'user'  => '',
		'psw'   => '',
		'db'    => '',
		'debug' => false
		);
	foreach($cfg as $key=>$value)
		{
		$cfg[$key] = isset($params[$key]) ? $params[$key] : $value;
		}
	//$cfg['query'] = ;
	$this->cfg   = $cfg;
//	if ($this->cfg['debug'])
//		{
//		$this->query = function ($query) {$this->queryDebug($query);};
//		}
//	else	{
//		$this->query = function ($query) {$this->querySafe($query);};
//		}
//var_dump($this->query);
//	return (!$this->cfg['debug']) ? $this->query1($query) : $this->query2($query);

//echo $this->query = $this->($this->query);
//	$this->query = $this->{$this->query};
//($query);
//function($query) {}
	}

	function connect()
	{
//phpinfo();
	$this->conn = new PDO('mysql:host='.$this->cfg['host'].';dbname='.$this->cfg['db'], $this->cfg['user'], $this->cfg['psw'])
			or $this->error();
//	$x = $this->cfg['query'];
//	$x = $this->{$x};
//	$x($query);
	}

	public function disconnect()
	{
	if (isset($this->conn))
		{
		$this->conn = null;
		}
	}  

//	function free($result)
//	{
//	mysql_free_result($result);
//	}

	public function lastInsertId()
	{
	return ($this->sth_exec) ? $this->conn->lastInsertId() : null;
	}

	public function query($query)
	{
//	$x = $this->cfg['query'];
//	$x = $this->{$x};
//	$x($query);
	if ($this->cfg['debug'])
		{
		return $this->queryDebug($query);
		}
	else	{
		return $this->querySafe($query);
		}
	}

	public function querySafe($query)
	{
	$this->sth = $this->conn->prepare($query);
	$this->sth_exec = $this->sth->execute();
	return $this->sth;
	}

	public function queryDebug($query)
	{
	echo "\n<div class=\"query\">query = ".$query."</div>";
	return $this->querySafe($query)
		    or die('Chyba pdo_query: ' . $this->sth->errorCode().' '.implode(" - ",$this->sth->errorInfo()));
	}

	public function fetch($sth=null)
	{
//	var_dump( $this->sth->fetch(PDO::FETCH_ASSOC));	//$sth
	$sth = !$sth ? $this->sth : $sth;
	return $sth->fetch(PDO::FETCH_ASSOC);	//$sth
	}

//	public function numRows($sth)
//	{
//	return $sth->query('SELECT FOUND_ROWS()')->fetchColumn();
//	}

	public function createInsert($_table,$_data,$_idname='')
	{
	if ($_idname!='' && isset($_data[$_idname])) {unset($_data[$_idname]);}
	$keys   = array();
	$values = array();
	foreach ($_data as $key=>$value)
		{
		$keys[]   = $this->escapeKey($key);
		$values[] = $this->escape($value);
		}
	return "INSERT INTO ".$this->escapeKey($_table)." (".implode(", ",$keys).") VALUES (".implode(", ",$values).")";
	}

	public function createUpdate($_table,$_data,$_idname)
	{
	$_id    = array($_idname=>$_data[$_idname]);
	unset($_data[$_idname]);
	$values = array();
	$where  = array();
	foreach ($_data as $key=>$value)
		{
		$values[] = $this->escapeKey($key)."=" . $this->escape($value);
		}
	foreach ($_id as $key=>$value)
		{
		$where[] = $this->escapeKey($key)."=" . $this->escape($value);
		}
	return "UPDATE ".$this->escapeKey($_table)." SET ".implode(", ",$values)." WHERE ".implode(' AND ',$where);
	}

	public function createDelete($_table,$_id)
	{
	$where  = array();
	foreach ($_id as $key=>$value)
		{
		$where[] = $this->escapeKey($key)."=" . $this->escape($value);
		}
	return "DELETE FROM ".$this->escapeKey($_table)." WHERE ".implode(' AND ',$where);
	}

	public function escape($value='')
	{
	return $this->conn->quote($value);
	}

	public function unEscape($value='')
	{
	return $this->conn->quote($value);
	}

	public function escapeKey($value='')
	{
	return "`".str_replace("`","``",$value)."`";
	}

	public function escapeSelect($value='')
	{
	$m = strlen($value);
	$value = preg_replace('~UPDATE|REPLACE|DELETE|CREATE~i','',$value);
	$n = strlen($value);
	return $m==$n ? $value : '';
	}

};

/*
$sql = new classSql(array(
	'host'  => 'localhost',
	'user'  => 'root',
	'psw'   => '',
	'db'    => 'urb_news',
	'debug' => true
	));
*/
?>

Ale v konecnem dusledku to pak v programu resim takto

        $query2  = selectQuery($table,$where2);
        $result2 = $sql->query($query2);
        if ($sql->sth_exec && $result2->rowCount()>0)
            {
            while(($row2 = $sql->fetch())!==false)
                {
                $x = 0;
                foreach($row2 as $value2)
                    {

                    $bool2 &= $value2==$row[$x];
                    ++$x;
                    }
                break;    // first row
                }
 
			$query  = $sql->createDelete('schedule',$data_delete);
			$result = $sql->query($query);
			if ($sql->sth_exec && $result->rowCount()>0)
				{$notice[] = sprintf($lng['all']['delete_true'],$result->rowCount()); $bool_join=true;}
			else	{$notice[] = $lng['all']['delete_false'].keyString($data,$id_name);}

Treba casto fetchuji vic resultu. Dalo mi to asi 2 dny googlovani, nez jsem prisel na to, co z toho je vlastne result. Hlavne, ze tam maji spesl nelogicke nazvy objektu jako sth. Co je sth? Zkratka? Proc je tam zkratka a ne kratke srozumitelne slovo? To delal nejaky vul!
Takze budu dal zaryte python a php-pdo "hater", protoze v necem tak strasnem se neda programovat.

Nahlásit jako SPAM
IP: 2001:718:2601:258:413b:94...–
peter
~ Anonymní uživatel
4014 příspěvků
9. 10. 2015   #6
-
0
-

OT Takhle, abys to spatne nepochopil. Jen mne rozciluje, ze lidi tlacis do technologie, ktera funguje hur nez ta predchozi.
Tohle jsem zazil za poslednich 10 let na jinem forku o html. Sposta kecu o tom, jak jsou framy a tabulky spatne. Ale proste 10 let neustale v tom forku jsou dotazy, proc mi to s float nefunguje, jak ma? Protoze float vyzaduje spesl konstrukci pro ruzne prohlizece a prohlizece ho neumi spravne zpracovat podle toho, jak by to logicky melo fungovat. Tudiz float je stale ta spatna technologie, na kterou se nelze spoleha. Proti tomu tabulka se zobrazi vicemen spravne. A kdyz ne uplne, tak aspon logocky a nekomplikuje uzivateli zivot nejakym prekryvanim obsahu, odskakovanim a pod.

Nahlásit jako SPAM
IP: 2001:718:2601:258:413b:94...–
ondrej39+1
Věrný člen
9. 10. 2015   #7
-
0
-

#6 peter

V tomto s tebou nesouhlasím.

Stejně jako tebou zmíněné floaty, i PDO člověk musí umět používat... Mně, jako člověku, který programuje objektově, PDO knihovna, která je také objektově napsaná, zcela vyhovuje, přijde mi intuitivní. Tobě trvá přijít 2 dny na to, co je result, mně to zabralo 10 minut.

Rozhodně není nutnost, aby každý používal PDO, ať klidně používají mysqli_* funkce, nicméně v mém případě, kdy bych mysqli_* funkce používal já, si stejně udělám databázový driver implementující DA interface, který mi zmíněné mysqli_* funkce zabalí a jsem zpátky u objektů.

Nahlásit jako SPAM
IP: 78.156.159.–
Inject all the dependencies!
peter
~ Anonymní uživatel
4014 příspěvků
9. 10. 2015   #8
-
0
-

Nevim, jaky je rozdil mezi mysql a i. Nicmene zastavam nazor, ze mysql bylo udelano dobre a neni duvod jej rusit na ukor horsich technologii. A kdyz uz, proc to nejde vsechno pres z-driver, jak se to snazil resit jeden cas python? Jeden driver na vse.

Nahlásit jako SPAM
IP: 2001:718:2601:258:413b:94...–
Kit+15
Guru
9. 10. 2015   #9
-
0
-

#5 peter

Jedine, co je tam jako vylepseni je pouze to, ze to umi prepisovat promenne do sql prikazu.

Mýlíš se. Nepřepisují se proměnné, ale data. PDO přepisovat proměnné neumí a je to tak správně.

Možná sis nevšiml, že PDO se skládá ze tří tříd: PDO, PDOstatement a PDOException. Nejspíš z těchto důvodů máš problémy se zpracováním $result. Úplně ti vypadla aktivace PDOException - to bude zřejmě hlavní důvod, proč ti to nefunguje dle tvých představ.

Ten tvůj pokus o univerzální knihovnu je úplně zcestný - už to otevírání databáze mi připadá jako zoufalé. Mohl jsi tam mít krásné metody, například insert(): 

<?php
function insert($table, $data) {
    $keys = implode(", ", array_keys($data));
    $values = implode(", ", array_map(
        function($sloupec) {
            return '?';
        },
        $data));
    $statement = $this->getConn()->prepare("INSERT INTO $table ($keys) VALUES ($values)");
    $statement->execute(array_values($data));    return $statement->rowCount();
}

// volání:
$data = array(
    "jmeno"      => "Adam",
    "prijmeni"   => "Bernau",
    "cislo_bot"  => 42,
);
$vlozeno = $db->insert('uzivatel', $data);
if ($vlozeno <1) {
    throw new Exception('Nepodařilo se uložit data');
}

Podobně si můžeš udělat třeba select(), delete() či update(), ale dávej pozor na to, že univerzální řešení často není univerzální. Zejména u selectu snadno narazíš.

Zkus se pokud možno vyhýbat statickým metodám. To jsou takové, ve kterých není použito $this->

Escapování názvů tabulek a polí si tam dodělej sám.

K otázce ohledně názvu $dbh: Je to zkratka z DataBaseHandler. Raději však používám jen $db - ovšem jen v případě, že mám otevřenu pouze jednu databázi. Rozhodně je $dbh lepší, než $sql, který je zcela špatně a svědčí o totálním nepochopení. Proměnná $sql by se podle mne měla používat pouze pro text SQL dotazu.

Chybně je i pojmenování databázové třídy "classSql", protože nepracuješ s třídou ani s SQL, ale s databází. SQL je pouze jazyk. Osobně jsem si oblíbil název třídy MyPDO (vyjadřuje, že je to můj wrapper nad třídou PDO), který možná není ideální, ale určitě je lepší.

Nahlásit jako SPAM
IP: 194.228.13.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Sigurd
~ Anonymní uživatel
8 příspěvků
9. 10. 2015   #10
-
0
-

 Koukám, že se to tu zvrhlo ve výměnů názorů :)
No tady je to co sem naposledy zkoušel:

 


$filename = "backup-file.sql";
$templine = file_get_contents($filename);
mysql_query($templine, $connect) or die('Chyba ve vkládání QUERY příkazu \'<strong>' . htmlspecialchars($templine) . '\': ' . mysql_error() . '<br /><br />');

 A zde obsah sql souboru :

USE `drdforum.mys4942`;
DROP TABLE ARTICLES;

CREATE TABLE `ARTICLES` (
  `ID` int(5) NOT NULL AUTO_INCREMENT,
  `TITLE` varchar(65) NOT NULL,
  `CONTENT` text NOT NULL,NULL,
  `IMG` varchar(255) NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=102 DEFAULT CHARSET=utf8;

INSERT INTO ARTICLES VALUES("1", .... další řádky kodu.... 
Nahlásit jako SPAM
IP: 90.182.180.–
Sigurd
~ Anonymní uživatel
8 příspěvků
9. 10. 2015   #11
-
0
-

Peter:  Identický kód je, protože to byl zdroj, odkud jsem čerpal než jsem psal na forum.

Nahlásit jako SPAM
IP: 90.182.180.–
Sigurd
~ Anonymní uživatel
8 příspěvků
9. 10. 2015   #12
-
0
-

 
Ať  zkouším přímé vložení pomocí jednoduchého příkazu nebo tento i další složitější algoritmy tak mi vždy  ohlásí  že vše bylo provedeno. Ve skutečnosti však databáze zustane stejná.

 Jen u těchto jednoduchýh příkazů co jsem uvedl poslední mi oznámí chybu jenom DIE();

Když však kód z sql souboru zkopíruju do konzole phpmyadmin tak kod ze souboru je v pořádku.
Takže dělám chybu v odesílání dat do DB. Bohužel vůbec nevím kde ...

Nahlásit jako SPAM
IP: 90.182.180.–
Kit+15
Guru
9. 10. 2015   #13
-
0
-

#12 Sigurd
Tak si to z toho phpMyAdmin vykuchej. Aspoň uvidíš spoustu dalších technik.

V PDO existuje metoda exec(), které můžeš předat více SQL dotazů v jednom stringu.

<?php
$filename = 'moje_zaloha.sql';
$db = new PDO('mysql:host=localhost;dbname=dump', 'root', '123456');
$sqlJob = file_get_contents($filename);
$db->exec($sqlJob);

Tyto řádky by měly nahradit celý tvůj původní skript. Je otestován a je funkční.

Nahlásit jako SPAM
IP: 194.228.13.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Sigurd
~ Anonymní uživatel
8 příspěvků
9. 10. 2015   #14
-
0
-

#13 Kit
Asi se přiučím trochu PDO :) Vše funguje!
 

Nahlásit jako SPAM
IP: 90.182.180.–
Kit+15
Guru
9. 10. 2015   #15
-
0
-

#14 Sigurd
Pozor na to, že od určité velikosti importované databáze (někde v řádu MB) to fungovat přestane a budeš to muset řešit tuningem nebo i jinak.

Dále je dobré tam doplnit hlášení chyb. Asi nějak takto: 

<?php
$options = array(
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
);  
$filename = 'moje_zaloha.sql';
try {
    $db = new PDO('mysql:host=localhost;dbname=dump', 'root', '123456', $options);
    $sqlJob = @file_get_contents($filename);
    if ($sqlJob === FALSE) {
        throw new Exception("Záloha '$filename' nenalezena");
    }
    $db->exec($sqlJob);
} catch (Exception $e) {
    echo $e->getMessage(), "\n";
}

Mělo by to zachytit chybu spojení s databází, chybějící soubor "moje_zaloha.sql" i chybu v samotném SQL. Vše vypíše jediné echo $e->getMessage();

BTW: Zapomeň na die();

Nahlásit jako SPAM
IP: 194.228.13.–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
peter
~ Anonymní uživatel
4014 příspěvků
12. 10. 2015   #16
-
0
-

Ty sem davas proste kousky kodu, ktere nelze pouzit :)

mysql_query($templine, $connect) // a co je v $connect, kde je ten kod?

Vymena nazoru/informaci musi byt. S necim u Kita souhlasim, s jinym ne, z toho, co napsal. Hlavne mi vadi jeho pristup k msql a nuceni PDO.

Nahlásit jako SPAM
IP: 2001:718:2601:26c:d8ef:73...–
peter
~ Anonymní uživatel
4014 příspěvků
12. 10. 2015   #17
-
0
-

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 'NULL, `IMG` varchar(255) NOT NULL, PRIMARY KEY (`ID`) ) ENGINE=InnoDB AUT' at line 4

`CONTENT` text NOT NULL,NULL, - 2x null

Mno, a funkcni priklad pro testovani si predstavuji takto (coz je prvni kod + sql kod, co jsi ted napsal naposled):

<?php

$mysql_host = 'localhost';
$mysql_user = 'root';
$mysql_psw  = '';
$mysql_db   = 'test';
$filename = 'import.sql';

mysql_connect($mysql_host, $mysql_user, $mysql_psw) or die('Chyba v připojení : MySQL server: ' . mysql_error());
mysql_select_db($mysql_db) or die('Chyba ve vybrání DB: ' . mysql_error());
$templine = '';
$lines = file($filename);
foreach ($lines as $line)
 {
if (substr($line, 0, 2) == '--' || $line == '')
{
	   echo "Vynechano: <pre>$line</pre>";
   continue;
}
$templine .= $line;
if (substr(trim($line), -1, 1) == ';')
{
	$result = mysql_query($templine);
	if ($result) {mysql_free_result($result);}
	else {
	   echo '<br>Chyba ve vkládání QUERY příkazu <pre>' . htmlspecialchars($templine) . '<br>' . mysql_error() . '</pre>';
	}
	$templine = '';
}
}
echo "Konec importu";
?>
-- USE `drdforum.mys4942`;
DROP TABLE IF EXISTS ARTICLES;

CREATE TABLE `ARTICLES` (
  `ID` int(5) NOT NULL AUTO_INCREMENT,
  `TITLE` varchar(65) NOT NULL,
  `CONTENT` text NOT NULL,
-- NULL,
  `IMG` varchar(255) NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=102 DEFAULT CHARSET=utf8;


-- INSERT INTO ARTICLES VALUES("1", .... další řádky kodu...

Jestli ti to s chybou proslo pres pdo, tak je to dost podezrele. Nejspis lze v pdo takove chovani potlacit, aby taky hlasil chyby.

Nahlásit jako SPAM
IP: 2001:718:2601:26c:d8ef:73...–
Kit+15
Guru
12. 10. 2015   #18
-
0
-

#16 peter
Nevím, co je msql, ale do nucení k PDO mě vede to, že nepředpokládám životnost toho starého ovladače déle než rok. Je označen za zastaralý a v PHP 7.0 už není.

Nahlásit jako SPAM
IP: 2a00:1028:83a0:37a6:c496:...–
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 8 hostů

Podobná vlákna

[DB] import sql dumpu — založil netman92

Import REG souborů — založil Reverend

VBA - import souborů — založil Smouker

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý