php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 24.02.2005, 09:34  
Gast
 
Beiträge: n/a
Standard SQL-Script über PHP

Hi,

mein Problem gehört wohl in zwei Rubriken aber ich bringe es mal hier rein.

Ich habe ein SQL-Script welches ich Euch nicht unbedingt zumuten möchte.

Ich versuche jetzt mit PHP ein Setup-Seite zu machen welches nix anderes macht als eine Datenbank neu zu erstellen bzw. eine vorhandene zu verwenden und dort die Tabellen die im Sql--Script sind anzulegen.

Meine PHP-Datei sieht wie folgt aus:

PHP-Code:
<?php
<?php
// ==================================================================================================
// INCLUDES 
// ==================================================================================================
// ==================================================================================================
// Initialisieren der internen Variablen nach Start der Installation
// ==================================================================================================
    
if ($_POST["su_action"] == "GO")
    {
      
$dbhost $_POST["su_dbhost"];
      
$dbpassword $_POST["su_dbpassword"];
      
$dbuser $_POST["su_dbuser"];
      
$dbname $_POST["su_dbname"];
      
$dbcreate $_POST["su_dbcreate"];
    }
// ==================================================================================================
// Pr&uuml;fen der eingegebenen Werte und connect zur Datenbank
// ==================================================================================================
    
if ($_POST["su_action"] == "GO")
    {
      
$db = new Database($dbhost$dbname$dbuser$dbpassword); // Datenbankobjekt initialisieren
      
if (!$db->connect())                                        // Verbindung zum Server herstellen
        
$msgtxt "Die Verbindung zum Server ist fehlgeschlagen"// Verbindung zum Server konnte nicht hergestellt werden
      
else
      {
        if (
$dbcreate == "1")                                     // Soll die Datenbank neu erstellt werden ?
        
{    
          
$SqlString "CREATE DATABASE " $dbname ;         
          
$msgtxt $db->executeSql($SqlString);
            if (
$msgtxt == "")
            {                                         
// Erstellen der Datenbank war erfolgreich
              
$msgtxt $db->open();                              // &Ouml;ffenen der Datenbank
              
if ($msgtxt != "")
                
$msgtxt "Fehler bei &Ouml;ffnen der Datenbank. " $msgtxt;
            }
            else
              
$msgtxt "Fehler beim Erstellen der Datenbank. " $msgtxt;
        }
        else
        {                                                         
// Datenbank soll nicht neu erstellt werden
          
$msgtxt $db->open();                                  // &Ouml;ffnen der Datenbank
          
if ($msgtxt != "")
            
$msgtxt "Fehler bei &Ouml;ffnen der Datenbank. " $msgtxt;
        }
      }
    }
// ==================================================================================================
// Falls kein Fehler aufgetreten ist Script zur Erstellung der Datenbank ausf&uuml;ren
// ==================================================================================================
    
if ($_POST["su_action"] == "GO" AND $msgtxt=="")
    {
      
$fp fopen("ip_setup_db.sql"'r') or die($msgtxt "Setup-Script ip_setup_db.sql im aktuellen Verzeichnis nicht vorhanden");
      if (
$msgtxt == "")
      {
        
$SqlString "";
        while (!
feof($fp))
        {
          
$SqlString trim($SqlString) . fgets($fp,1024);
        }
        print 
"Sql:" $SqlString;
        
$msgtxt $db->executeSql($SqlString);
        if (
$msgtxt == "")
          
$msgtxt "Tabellen wurden erstellt";
        else
          
$msgtxt "Fehler beim Erstellen der Tabellen. " $msgtxt;
      }
    }
?>
<html>
<head>
<title>iTEC Portal - Setup</title>
</head>
<body>

<form name="form1" action="<?php echo $_SERVER["PHP_SELF"]; ?>" method="post">
[b]Host[/b]

<input type="text" name="su_dbhost" value="<?php print $dbhost?>">


[b]Kennwort[/b]

<input type="password" name="su_dbpassword" value="<?php print $dbpassword?>">


[b]Benutzer[/b]

<input type="text" name="su_dbuser" value="<?php print $dbuser?>">


[b]Datenbankname[/b]

<input type="text" name="su_dbname" value="<?php print $dbname?>">


<input type="radio" name="su_dbcreate" value="1" <?php if ($dbcreate != "0") print 'checked="checked"'?>>
[b]Tabellen in neuer Datenbank erstellen ?[/b]

<input type="radio" name="su_dbcreate" value="0" <?php if ($dbcreate == "0") print 'checked="checked"'?>
[b]Tabellen in vorhandener Datenbank erstellen ?[/b]


<input type="submit" name="su_setup" value="Installation ausf&uuml;hren">
<input type="hidden" name="su_action" value="GO">
</form>
<?php print $msgtxt$msgtxt=""?>

</body>
</html>
<?php
// ==============================================================================
// Klassen
// ==============================================================================

// Stellt Funktionen, die mit Datenbank und DB-Zugriffen zu tun haben zur Verfügung
// ==============================================================================
class Database
{
// ==============================================================================

// function connect() 
//   Stellt die Verbindung zur Datenbank her

// function open()
//   Öffnet die ausgewählte Datenbankt

// function close()
//   Schließt die aktuelle Datenbank

// function selectSet($sqlstring="")
//   Liefert alle Sätze der Abfrage

// function openSet($sqlstring="")
//  Stellt ein set zur Bearbeitung mit slelectNext zur Verfügung

// function selectNext()
//   Liefert den nächsten Satz der Abfrage 

// function selectRecord($sqlstring="") 
//   Liefert einen Satz einer Abfrage

// function selectField($sqlstring="", $fieldnr=0)
//   Liefert das übergeben Feld aus dem ersten Satz der Abfrage

// function executeSql($sqlstring="")
//   führt ein übergebenes SQL-Statement aus ( write, update, delete )
// falls ein Fehler auftritt wird die Fehlermeldung als String zurückgegeben

// ------------------------------------------------------------------------------
// Attribute
// ------------------------------------------------------------------------------

    
var $Host;
    var 
$User;
    var 
$Pwd;
    var 
$DBName;

    var 
$SqlString;

    var 
$LinkID;
  var 
$Set;

// ------------------------------------------------------------------------------
// Konstruktor
// ------------------------------------------------------------------------------
    
function Database($host$dbname$user$pwd)
    {
        
$this->Host $host;
        
$this->User $user;
    
$this->Pwd $pwd;
    
$this->DBName $dbname;
    }

// ------------------------------------------------------------------------------
// GET- und SET-Methoden
// ------------------------------------------------------------------------------

    
function setHost($host)
    {
        
$this->Host $host;
    }
    function 
getHost()
    {
        return 
$this->Host;
    }

    function 
setUser($user)
    {
        
$this->User $user;
    }
    function 
getUser()
    {
        return 
$this->User;
    }

    function 
setPwd($pwd)
    {
        
$this->Pwd $pwd;
    }
    function 
getPwd()
    {
        return 
$this->Pwd;
    }

    function 
setDBName($dbname)
    {
        
$this->DBName $dbname;
    }
    function 
getDBName()
    {
        return 
$this->DBName;
    }

    function 
setSqlString($sqlstring)
    {
        
$this->SqlString $sqlstring;
    }
    function 
getSqlString()
    {
        return 
$this->SqlString;
    }

    function 
getLinkID()
    {
        return 
$this->LinkID;
    }

// ------------------------------------------------------------------------------
// Methoden
// ------------------------------------------------------------------------------

    
function connect()
    {
    
$this->LinkID mysql_connect($this->Host$this->User$this->Pwd);
        if (!
$this->LinkID) return false;

        return 
$this->LinkID;

    }

    function 
open()
    {

        if (!
mysql_select_db($this->DBName$this->LinkID))
    {
      return 
mysql_error($this->LinkID);
    }
    }

    function 
close()
    {
         
mysql_close($this->LinkID);
    }

    function 
selectSet($sqlstring="")
    {
        if (
$sqlstring != "")
        {
            
$this->SqlString $sqlstring;
        }

        
$this->Set mysql_query($this->SqlString$this->LinkID);
        if (!
$this->Set) die("Fehler in der Abfrage. Abfrage:" $this->SqlString);
        return 
$this->Set;
    }

    function 
openSet($sqlstring="")
    {
        if (
$sqlstring != "")
        {
            
$this->SqlString $sqlstring;
        }
        
$this->Set mysql_query($this->SqlString$this->LinkID);
        if (!
$this->Set) die("Fehler in der Abfrage. Abfrage:" $this->SqlString);
    }

  
    function 
selectNext()
    {
      
$zeile mysql_fetch_array($this->Set,MYSQL_BOTH);
    if (!
$zeile)
     return 
False;
    else
         return 
$zeile;
    }
  
    function 
selectRecord($sqlstring="")
    {
        if (
$sqlstring != "")
        {
            
$this->SqlString $sqlstring;
        }

        
$resID mysql_query($this->SqlString$this->LinkID);
        if (!
$resID) die("Fehler in der Abfrage. Abfrage:" $this->SqlString);
        
$zeile mysql_fetch_array($resID,MYSQL_BOTH);
        return 
$zeile;

    }

    function 
selectField($sqlstring=""$fieldnr=0)
    {
        if (
$sqlstring != "")
        {
            
$this->SqlString $sqlstring;
        }

        
$resID mysql_query($this->SqlString$this->LinkID);
        if (!
$resID) die("Fehler in der Abfrage. Abfrage:" $this->SqlString);
        
$zeile mysql_fetch_array($resID,MYSQL_BOTH);
        return 
$zeile[$fieldnr];

    }

    function 
executeSql($sqlstring="")
    {
        if (
$sqlstring != "")
        {
            
$this->SqlString $sqlstring;
        }
        if (!
mysql_query($this->SqlString$this->LinkID))
    {
      return 
mysql_error($this->LinkID);
    }
  }

}

?>
?>
Der Beginn meines SQL-Scripts (jetzt mute ich es Euch halt doch mal zu ) sieht wie folgt aus

SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT;
SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS ;
SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION;
SET NAMES utf8;

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE=NO_AUTO_VALUE_ON_ZERO */;


CREATE TABLE `ip_areatab_t` (
`id` int(10) unsigned NOT NULL auto_increment,
`area` varchar(45) character set utf8 NOT NULL default '',
`tablename` varchar(45) character set utf8 NOT NULL default '',
`area_group` varchar(45) character set utf8 default NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ip_areatab_l1` (`area`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Tab. für Bereiche des Portals und Verbindung zu Tabellen';
INSERT INTO `ip_areatab_t` (`id`,`area`,`tablename`,`area_group`) VALUES
(1,'head','ip_head_t',NULL),
(2,'foot','ip_foot_t',NULL),
(3,'content1','ip_content_t','content'),
(4,'content2','ip_content_t','content'),
(5,'info1','ip_info_t','info'),
(6,'info2','ip_info_t','info'),
(7,'info3','ip_info_t','info'),
(8,'info4','ip_info_t','info');

Jetzt meckert er mir folgenden Fehler an:

Fehler beim Erstellen der Tabellen. 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 ';SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS ;SET @OLD_COLLATION_CONNE' at line 1

Wie man sieht lese ich das Script ein und übergebe es komplett an mysql_query.
Hat mysql-query Probleme mehrere Anweisungen gleichzeitg auszuführen oder kann mysql-query nicht mit den SETs umgehen. Oder habe ich vielleicht die Möglichkeit über einen PHP-Befehl das SQL-Script direkt auszuführen ohne es einlesen zu müssen ???

Fragen über Fragen. Kann mir da jemand helfen ?
  Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 24.02.2005, 09:39  
Erfahrener Benutzer
 
Registriert seit: 02.04.2008
Beiträge: 2.603
Corvin befindet sich auf einem aufstrebenden Ast
Standard

Du erwartest doch nicht wirklich, dass sich das jemand anguckt?
- Keine PHP-Tags verwendet
- 0 Code-Einrückungen
- ...
Hm ne, das tue ich mir nicht an.
Corvin ist offline   Mit Zitat antworten
Alt 24.02.2005, 09:49  
Gast
 
Beiträge: n/a
Standard

Was heisst keine PHP-Tags verwendet. Naja vielleicht hast Du Dir es wirklich nicht angeschaut. Das mit den Einrückungen hat er anscheinend geschluckt, bei mir im Editor sind schon Einrückungen.

Der Code ist ja eigentlich auch nicht so wichtig wenn Du Dir meine Fragen am Ende richtig durchliest.

Also nochmal. Das SQL-Script besteht aus mehreren Anweisungen. Das ist ja nicht so gross und man kann es sich ja mal kurz ansehen.

Jetzt die Frage. Kann mysql_query mehrere SQL-Anweisungen die mit Semikolon getrennt sind ausführen oder habe ich die Möglichkeit über einen PHP-Befehl das ganze SQL-Script auszuführen. Oder hat mysql_query lediglich Probleme mit den SET zu beginn des SQL-Scripts.

Niemand braucht sich das PHP-Script anzusehen. Und bitte lieber keinen Kommentar als der davor, wobei ich diesen schon verstehen kann

Danke
  Mit Zitat antworten
Alt 24.02.2005, 13:27  
Gast
 
Beiträge: n/a
Standard

Um es vielleicht noch einfacher auszudrücken. Wie kann ich das Sql-Script über PHP ausführen ? Muss ich es einlesen und Zeile für Zeile mit mysql_query abarbeiten oder geht es einfacher ?
  Mit Zitat antworten
Alt 24.02.2005, 13:38  
Moderator
 
Benutzerbild von robo47
 
Registriert seit: 03.09.2004
Beiträge: 11.792
PHP-Kenntnisse:
Fortgeschritten
robo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz sein
Standard

bitte, editier deine posts und benutze die [php]-tags um deinen code herum, dann klappts mit dem syntaxhighlighting und dem einrücken ohne probleme und man kann auch was lesen udn erkennen und verliert nicht schon nach 2 zeilen die lust. und so sachen wie "bei mir im Editor sind schon Einrückungen." sind nonsens, wenn du willst dass die leute dir hier helfen, solltest du ihnen ein einigermassen gut lessbares script vorlegen.

so zu deinem problem, zeile für zeile ist problematisch, weil du dann deine create-table querys zerhaust etc. such mal hier aufm forum, ich habe vor einiger zeitm la die funktion aus phpmyadmin rausgesucht die benutzt wird wenn man mit phpmyadmin einen datenbankdump einspielt und die dafür die einzelnen querys trennt udn in ein array schreibt. mit dem array kannst du dann element für element deine querys absetzen.

mfg
robo47
robo47 ist offline   Mit Zitat antworten
Alt 24.02.2005, 14:12  
Gast
 
Beiträge: n/a
Standard

Ok werde ich versuchen. Jetzt weiss ich auch was mit PHP-Tags gemeint war. Danke.
  Mit Zitat antworten
Alt 24.02.2005, 15:09  
Erfahrener Benutzer
 
Benutzerbild von lazydog
 
Registriert seit: 02.04.2008
Beiträge: 4.032
lazydog befindet sich auf einem aufstrebenden Ast
Standard

Ich hab deinen Code nicht gross angeschaut, aber mehrere Abfragen in einem mysql_query() funktionieren nicht. Das Problem ist, dass zu jeder Abfrage eine Ressource ID zurückgegeben wird, und spätestens wenn du mehr als einen Select in einem Script hast, wird es dann schwierig.
Also bleibt nichts anderes, als das Script an ";" zu splitten, und dann die Befehle in einer Schleife einzeln auszuführen.
Alternativ könntest du - falls du die nötige Berechtigung hast - mit shell_exec() direkt mysql mit dem zugehörigen Script aufzurufen.
__________________
Gruss
L
lazydog ist offline   Mit Zitat antworten
Alt 24.02.2005, 15:25  
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.814
axo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

ich hab deinen code auch nicht angeschaut, aber falls dein skript daran scheitert, dass multiple queries mit mysql_query nicht gehen, kannst du einfach folgende funktion verwenden.

PHP-Code:
<?php
        
/** 
     * simple dumpfile parser in order to generate multiple queries.
     * wants the $q to be a string of multiple sql queries from a file.
     * @param $dumpFileName string
     * @access public
     * @return string
    */
    
function parseDumpFile($q){
        
// strip the comments from the query
        
$q preg_replace('/--(.*)/','',$q);

        
$n=strlen($q);
        
$k=0;
        
$queries=array();
        
$current_delimiter='';

        for(
$i=0;$i<$n;$i++){
            
// if this slash escapes something,
            // current delimiter must not be affected
            
if(!isset($queries[$k])) {
                
$queries[$k] = '';
            }
            if(
$q[$i]=='\\' &&    ($q[$i+1]=='\\' || $q[$i+1]=="'" || $q[$i+1]=='"')    ){
                
$queries[$k].=$q[$i].$q[$i+1];
                
$i++;
                continue;
            }

            if(
$q[$i]==$current_delimiter) {
                
$current_delimiter='';
            } elseif(
$q[$i]=='`' || $q[$i]=="'" || $q[$i]=='"') {
                
$current_delimiter=$q[$i];
            }
            
            if(
$q[$i]==';' && $current_delimiter==''){
                
$queries[$k]=trim($queries[$k]);
                if(
trim(substr($q,$i),"\r \n;")!='')
                
$k++;
            } else {
                 
$queries[$k].=$q[$i];
            }
        }
        
        foreach(
$queries as $k => $v) {
            
$queries[$k] = trim($queries[$k]);
             if(
preg_match('/^\s*$/si',$queries[$k])) {
                unset(
$queries[$k]);
            }
            
        } 
          
        return 
array_values($queries);
    }
?>
eine mini-anpassung von einem auf www.php.net/mysql_query befindlichen skript in den user-comments.

das ding liest ein mysql-dump-file und gibt die einzelnen queries als array zurück.

die brauchst du nur noch mit einem foreach() hintereinander ausführen.
axo ist offline   Mit Zitat antworten
Alt 24.02.2005, 15:27  
Gast
 
Beiträge: n/a
Standard

Dass mit shell_exec ist wahrscheinlich ein Problem, denn wenn ich das Script ausliefere heisst es ja nicht dass jeder dann die entsprechende Berechtigung hat.

Ich habe es jetzt auch so gelöst dass ich über explode den kompletten String splitte. Als Trenner habe ich ; angegeben.
Es werden allerdings nicht nur Tabellen sondern auch Einträge in die Tabellen erstellt. Und jetzt hat jemand bei uns innerhalb eines Datensatzes ein ; eingetragen. explode trennt dann an dieser Stelle und macht zwei Arrayelemente daraus. Hast Du eine Idee wie ich das noch lösen könnte ?
  Mit Zitat antworten
Alt 24.02.2005, 15:30  
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.814
axo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

o.g. skript kann das problem übrigens auch nicht lösen
axo ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Diverses aus meinem Apache Logs robo47 Server, Hosting und Workstations 5 25.05.2007 22:45
Script beendet sich ohne Fehlermeldung Zahl PHP Tipps 2006 6 04.06.2006 20:41
passwort script problem PHP Tipps 2006 8 15.02.2006 10:30
[Erledigt] php script und ixed PHP Tipps 2005-2 14 12.10.2005 13:34
[Erledigt] Verzögerung durch included Script? Umgehen? PHP Tipps 2005-2 4 10.07.2005 19:26
[Erledigt] Relay Script PHP-Fortgeschrittene 11 01.06.2005 16:02
[Erledigt] Hilfe bei Download Verwaltungs Script PHP Tipps 2005 8 04.05.2005 10:29
Fehler bei Script, welches Ordner erstellt PsychoEagle PHP Tipps 2005 3 23.04.2005 16:03
[Erledigt] python script mit php aufrufen... PHP-Fortgeschrittene 1 17.11.2004 17:11
PHP Script aus PHP aufrufen Stümper PHP Tipps 2004 5 26.09.2004 08:15
"das" Script oder "der" Script?? Simbo Off-Topic Diskussionen 31 16.09.2004 17:04
Script bricht mitten in einer while Schleife ab PHP Tipps 2004 5 11.07.2004 17:16

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php sql script, sql script, sql script php, sql script in php, sql script mit php ausführen, sql script in php ausführen, sql script per php einlesen, sql script per php, sql sript, php-code aus sql erzeugen, sql script erstellen für tabellen einträge, sql datenbank über php erstellen script, php dir sql skript, php use sql script, sql script mit php, sql script in php starten, mysql php \sql-script\ mehrere befehle, sql mit php ausführen auf datenbank, sql script per php an datenbank übergeben, sql-script php

Alle Zeitangaben in WEZ +2. Es ist jetzt 05:31 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.