php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 08.03.2005, 22:06  
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.814
axo ist zur Zeit noch ein unbeschriebenes Blatt
Standard SHOW GRANTS ...

hi,

für ein automatisches installationsskript möchte ich herausfinden, ob die datenbank-angaben korrekt sind bzw. ob ich CREATE TABLE automatisch ausführen kann oder nicht.

dazu überprüfe ich nach erfolgreichem connect mit
Code:
SHOW GRANTS FOR user@host;
... ob ich die rechte bekomme oder nicht.

das problem ist nur, dass ich bei den meisten shared hostern nur ein 'no grants defined for user@host ...' bekomme.

weiß nun jemand einen anderen praktikablen weg, um die ACL eines mysql-benutzers herauszufinden?
axo ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 09.03.2005, 21:44  
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

befehl ausführen und fehlermeldung/nummer überprüfen.

oder ein test-sql-script, das ne ne tabelle erstellet, nen eintrag erstellet, den eintrag ändern, den eintrag löscht, ein truncate durchführt und dann die tabelle wieder löscht, damit hast du erstmal alles relavante und für jedes query kannst du ja über mysql_errno / mysql_error die rückgabe feststellen und auswerten

mfg
robo47
robo47 ist offline   Mit Zitat antworten
Alt 09.03.2005, 21:47  
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.814
axo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

genau das wollte ich aber vermeiden - denn es gibt ein problem:
ohne eine tabelle zu erstellen, kann ich kein insert machen ... ich kann ja nicht einfach 'SHOW TABLES ' machen und in eine evtl. beliebig gefundene tabelle versuchen, zeug reinzuschreiben
axo ist offline   Mit Zitat antworten
Alt 09.03.2005, 22:11  
Gast
 
Beiträge: n/a
Standard Re: SHOW GRANTS ...

Zitat:
Zitat von axo
weiß nun jemand einen anderen praktikablen weg, um die ACL eines mysql-benutzers herauszufinden?
Frag einfach den Hoster. MySQL rückt die Infos jedenfalls nur dann raus, wenn Du das RECHT dazu hast, einen solchen Query zu senden.
  Mit Zitat antworten
Alt 09.03.2005, 22:23  
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.814
axo ist zur Zeit noch ein unbeschriebenes Blatt
Standard Re: SHOW GRANTS ...

Zitat:
Zitat von meikel
Frag einfach den Hoster.
naja, wie gesagt gehört das zu einem automatischen installations-skript für massen-software - wenn ich den hoster fragen soll kann ich das zeug gleich selbst installieren - und ich persönlich weiß wie man mit phpmyadmin umgeht

naja, gut. bisher läuft das ganze so, dass ich die SHOW GRANTS -abfrage abschicke - falls kein mysql-error entsteht und im zurückgegebenen datensatz 'CREATE' steht, versuch' ich das zeug automatisch zu installieren, ansonsten (entweder mysql-error oder 'CREATE' nicht gefunden) bekommt der user die tabellen-angaben in einem textfeld und muss selbst schauen, dass er's aufspielt.

wäre nur schön gewesen, wenn's ein zusätzliches hintertürchen gegeben hätte.
axo ist offline   Mit Zitat antworten
Alt 09.03.2005, 22:40  
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

Zitat:
Zitat von axo
genau das wollte ich aber vermeiden - denn es gibt ein problem:
ohne eine tabelle zu erstellen, kann ich kein insert machen ... ich kann ja nicht einfach 'SHOW TABLES ' machen und in eine evtl. beliebig gefundene tabelle versuchen, zeug reinzuschreiben
deshalb sag ich ja ne tabelle selbst erstellen, mit nem zufälligen namen, z.b. vorher halt überprüfen ob sie schon exisitert und danach die tabelle wieder löschen.
robo47 ist offline   Mit Zitat antworten
Alt 09.03.2005, 22:43  
Gast
 
Beiträge: n/a
Standard Re: SHOW GRANTS ...

Zitat:
Zitat von axo
..., dass ich die SHOW GRANTS -abfrage abschicke - falls kein mysql-error entsteht und im zurückgegebenen datensatz 'CREATE' steht, versuch' ich das zeug automatisch zu installieren, ansonsten (entweder mysql-error oder 'CREATE' nicht gefunden) bekommt der user die tabellen-angaben ...
Normale (was ist schon normal) SQL User haben das Recht, innhalb ihrer Datenbank Tabellen zu erzeugen und zu löschen. Das PRIV CREATE von GRANT betrifft aber (wenn ich mich nicht schon wieder irre) das CREATE DATABASE.

Wenn der User, was auch möglich ist, kein Recht hat, eine Tabelle zu kreieren, dann kannst Du das Script auch mit die() beenden, weil es dann auch der PhpMyAdmin nicht schafft.

Wenn Error bei syntaktisch korrektem CREATE TABLE -> die("Kauf Dir 'nen ordentlichen Hoster!")
  Mit Zitat antworten
Alt 09.03.2005, 23:18  
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.814
axo ist zur Zeit noch ein unbeschriebenes Blatt
Standard Re: SHOW GRANTS ...

Zitat:
Zitat von meikel
Das PRIV CREATE von GRANT betrifft aber (wenn ich mich nicht schon wieder irre) das CREATE DATABASE.
da könntest sogar recht haben - es scheint auch dass SHOW GRANTS gar nicht das ausgibt, was ich eigentlich will -
Zitat:
This statement lists the GRANT statements that must be issued to duplicate the privileges for a MySQL user account.
... yepp. dummy-tabelle erzeugen, und wenn das fehlschlägt, code anzeigen.

dankeschön
axo ist offline   Mit Zitat antworten
Alt 09.03.2005, 23:46  
Gast
 
Beiträge: n/a
Standard Re: SHOW GRANTS ...

Zitat:
Zitat von axo
dankeschön
Keine Ursache. Sonst kriege ich bei solchen Tips immer nur die Androhung von Ohrfeigen u/o die Drohungen von den Anwälten enttäuschter User. <ggg>
  Mit Zitat antworten
Alt 10.03.2005, 17:12  
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.814
axo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

so, hab das ganze jetzt mal implementiert, und es scheint ziemlich prima zu funktionieren...
falls es jemand brauchen kann - hier der quelltext dazu.


PHP-Code:
<?php
/** 
 * a small checking class which performs some basic checks if the database fulfills the requirements.
 * @package util
 * @author axo ( setzen (at) neuecouch (dot) de )
 * @access public
 * @date 08.03.2005
 * @version 1.0
*/
class DatabaseCheck {

    var 
$_db;
    var 
$_error = array();
    var 
$_testResult;
    var 
$_dummyTable;
    var 
$_indexCreated;
    var 
$_tableAltered;
    
    
/**
     * constructor. 
     * nees a PEAR::DB instance to perform the queries.
     *  
     * @param $db DB_common
     * @return void
     * @access public
    */
    
function DatabaseCheck(&$db) {
        
$this -> _db = & $db;
    }
    
    
/** 
     * returns the errors as an array.
     * @param void
     * @return array
     * @access public
    */
    
function getError() {
        return 
$this -> _error;
    }

    
    
/** 
     * @desc give this function an array of database commands you need and it returns true if all
     * of them can be fulfilled and false if any cannot be fulfilled.
     * implemented commands are:
     * INSERT - insert new rows into tables 
     * DELETE - delete rows from tables 
     * UPDATE - update tables 
     * SELECT - select from tables
     * CREATE - create table
     * DROP - drop table
     * INDEX - add or remove indexes
     * ALTER - alter table
     * LOCK - lock and unlock tables
     * 
     * usage: $obj -> checkGrants(array('INSERT', 'DELETE','UPDATE'));
     * @param $granted array
     * @return boolean
     * @access public
    */
    
function checkGrants($toBeGranted) {
        
$toBeGranted array_map('strtoupper',array_values($toBeGranted));
        if(
count($toBeGranted) < 1) {
            return 
true;
        }
        
        
$implementedChecks = array(
            
'INSERT' => '_checkInsert',
            
'DELETE' => '_checkDelete',
            
'UPDATE' => '_checkUpdate',
            
'SELECT' => '_checkSelect',
            
'CREATE' => '_checkCreate',
            
'DROP'   => '_checkDrop',
            
'INDEX'  => '_checkIndex',
            
'ALTER'  => '_checkAlterTable',
            
'LOCK'   => '_checkLockTables',
          );
        
        
$granted = array();
        foreach (
$toBeGranted as $g) {
            if(!isset(
$implementedChecks[$g])) {
                
$this -> _error[] = $g ' not supported!';
                
$granted[$g] = 0;
                continue; 
            }
            
$granted[$g] = (int) call_user_func(array(&$this,$implementedChecks[$g]));
        }
        
$this -> _checkDrop(); // drop the table from the database.
        
return array_reduce(array_values($granted),create_function('$a,$b','return $a * $b;'),1);
    }
        
    
/** 
     * checks whether the LOCK TABLES command is available.
     * @param void
     * @return boolean
     * @access private
    */
    
function _checkLockTables() {    
        return (
$this -> _simpleTestQuery('LOCK TABLES {tableName} WRITE') && $this -> _simpleTestQuery('UNLOCK TABLES'));        
    }
    
    
/** 
     * performs a query and simply returns true if the query could be executed
     * successfully, false if not.
     * @param $sql string
     * @return boolean
     * @access private
    */
    
function _simpleTestQuery($sql) {
        
$tn = & $this -> _createDummyTable();
        if(
$tn === false) {
            return 
false;
        }        
        
$sql strtr($sql,array('{tableName}' => $tn));
        
$chk = & $this -> _expectErrorQuery($sql);
        return (
$chk !== false);
    }
    
    
/** 
     * checks whether the ALTER TABLE command is available.
     * @param void
     * @return boolean
     * @access private
    */
    
function _checkAlterTable() {
        if(
$this -> _tableAltered === null) {
            
$this -> _tableAltered =  $this -> _simpleTestQuery("ALTER TABLE `{tableName}` ADD `ding` INT( 11 ) UNSIGNED NOT NULL ");
        }
        return 
$this -> _tableAltered;
    }
    
    
/** 
     * checks whether the ALTER TABLE ... ADD INDEX and ALTER TABLE ... DROP INDEX works.
     * @param void
     * @return boolean
     * @access private
    */
    
function _checkIndex() {
        if(
$this -> _indexCreated === null) {
            
$this -> _indexCreated = (
                   
$this -> _simpleTestQuery("ALTER TABLE `{tableName}` ADD INDEX ( `id` )")
                && 
$this -> _simpleTestQuery("ALTER TABLE `{tableName}` DROP INDEX `id`")                                
                );
        }
        return 
$this -> _indexCreated;        
    }
    
    
/** 
     * checks whether DROP TABLE can be performed.
     * @param void
     * @return boolean
     * @access private
    */
    
function _checkDrop() {
        return (
$this -> _simpleTestQuery("DROP TABLE {tableName}") === true && ($this -> _dummyTable null) === null);
    }
    
    
/** 
     * checks whether a table can be created.
     * @param void
     * @return boolean
     * @access private
    */
    
function _checkCreate() {
        return (
$this -> _createDummyTable() !== false);
    }
    
    
/** 
     * checks whether a SELECT statement can be performed.
     * @param $value mixed
     * @return boolean
     * @access private
    */
    
function _checkSelect($value 'b')  {
        
$tn = & $this -> _createDummyTable();
        
$chk $this -> _checkInsert($value);
        if(
$chk === false) {
            return 
false;
        }
        
$sql 'SELECT feld FROM ' $tn ' WHERE feld=' .  $this -> _db -> quoteSmart($value);
        
$qry = & $this -> _expectErrorQuery($sql);
        if(
$qry === false) {
            return 
false;
        }
        
/* @var $qry DB_result */
        
$data = & $qry -> fetchRow(DB_FETCHMODE_ASSOC);
        return (
$data['feld'] == $value);
    }
    
    
/** 
     * checks for row deletion.
     * @param void
     * @return boolean
     * @access private
    */
    
function _checkDelete() {
        
$tn = & $this -> _createDummyTable();
        
$chk = & $this -> _checkInsert('ding');
        if(
$chk === false) {
            return 
false;
        }
        
$chk2 =  $this -> _simpleTestQuery('DELETE FROM {tableName} WHERE feld=' $this -> _db -> quoteSmart('ding'));
        if(
$chk2 === false) {
            return 
false;
        }
        
$qry = & $this -> _expectErrorQuery('SELECT feld FROM ' $tn ' WHERE feld=' $this -> _db -> quoteSmart('ding') );
        if(
$qry === false) {
            return 
false;
        }
        return (
$qry -> numRows() < 1);
    }
    
    
/** 
     * checks for row update.
     * @param void
     * @return boolean
     * @access private
    */
    
function _checkUpdate() {
        
$tn = &$this -> _createDummyTable();
        
$chk = & $this -> _checkInsert('ding');
        
$sql 'SELECT id FROM ' $tn ' WHERE feld=' $this -> _db -> quoteSmart('ding');
        
$qry = & $this -> _expectErrorQuery($sql);
        if(
$qry === false || $qry -> numRows() < 1) {
            return 
false;
        }
        
        
$data = & $qry -> fetchRow(DB_FETCHMODE_ASSOC);
        
$sql2 'UPDATE ' $tn ' SET feld=' $this -> _db -> quoteSmart('dong') . ' WHERE id=' . (int)$data['id'];
        if(!
$this -> _simpleTestQuery($sql2)) {
            return 
false;
        }
        
$sql3 'SELECT feld FROM ' $tn ' WHERE id=' . (int) $data['id'];
        
$qry3 = & $this -> _expectErrorQuery($sql3);
        if(
$qry3 === false || $qry3 -> numRows() < 1) {
            return 
false;
        }
        
$data = & $qry3 -> fetchRow(DB_FETCHMODE_ASSOC);
        return (
$data['feld'] === 'dong');
        
    }
        
    
/** 
     * tries to create a dummy table.
     * if the creation fails, it returns false.
     * if it works, it returns the name of the dummy table.
     * @param void
     * @return mixed
     * @access private
    */
    
function _createDummyTable() {
        if(
$this -> _dummyTable !== null) {
            return 
$this -> _dummyTable;
        }
        
        
$dummyTable 'a_table_' time();
        
$sql "CREATE TABLE `" .$dummyTable "` (
              `id` SMALLINT(3) UNSIGNED NOT NULL, 
              `feld` VARCHAR(32) NOT NULL
        )"
;
        
$db = & $this -> _db;
        
/* @var $db DB_common */
        
$db -> expectError();
        
$qry = & $this -> _expectErrorQuery($sql);
        if(
$qry === false) {
            
$this -> _error[] = 'table creation failed.';
            
$this -> _error[] = mysql_error();
            
$this -> _dummyTable false;
            return 
false;
        }
        
$this -> _dummyTable $dummyTable;
        return 
$this -> _dummyTable;
    }
        
    
    
/** 
     * performs a dummy insert operation into $tablename with value $value.
     * @param $tableName string
     * @param $value string
     * @access public
     * @return void
    */
    
function _checkInsert($value 'a') {
        return 
$this -> _simpleTestQuery('INSERT INTO {tableName} SET feld=' $this -> _db -> quoteSmart($value));
    }
    
    
/** 
     * performs a 'safe' query to the database.
     * returns false if the query has failed, the query object if succeeded.
     * @param $sql string
     * @return mixed
     * @access public
    */
    
function &_expectErrorQuery($sql) {
        
$db = & $this -> _db;
        
/* @var $db DB_common */
        
$db -> expectError();
        
$qry = & $db -> query($sql);
        if(
$db -> isError($qry)) {
            
$db -> popExpect();
            return 
false;
        }
        return 
$qry;
    }
    
    
/** 
     * checks the database size.
     * @param void
     * @return integer
     * @access public
     * @TODO implement this correctly.
    */
    
function checkDbSize() {
             
$query "SHOW TABLE STATUS FROM "$db;
             if (
$result mysql_query($query)) {
               
$tables 0;
               
$rows 0;
               
$size 0;
               while (
$row mysql_fetch_array($result,MYSQL_ASSOC)) {
                   
$rows += $row["Rows"];
                   
$size += $row["Data_length"];
                   
$size += $row["Index_length"];
                   
$tables++;
               }
           }
             
$data[0] = $size;
             
$data[1] = $tables;
             
$data[2] = $rows;
             return 
$data;

    }

    
/** 
     * simple dumpfile parser in order to generate multiple queries.
     * the dumpfile can be a file generated by phpmyadmin.
     * wants the $q to be a string of multiple sql queries from a file.
     * @param $dumpFileName string
     * @access public
     * @return string
    */
    
function parseDumpFile($q){
        
$q preg_replace('/--(.*)/','',$q);

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

    
        for(
$i=0;$i<$n;$i++){
            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);
    }
    
}

?>
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
SHOW DATABASES: Platzhalterproblem iRadiaX Datenbanken 4 30.04.2006 14:51
Show & Hide PHP Tipps 2005-2 3 12.09.2005 08:02
[Erledigt] SHOW TABLES Probelm Datenbanken 1 08.08.2005 14:00
Runtime Information ph!l Datenbanken 4 15.06.2005 15:43
SHOW PROCESSLIST und TEMPORARY TABLES tapferesschneiderlein Datenbanken 2 05.03.2005 11:40
SHOW PROCESSLIST und »Host« (4.0.12-nt) tapferesschneiderlein Datenbanken 6 02.03.2005 10:53

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php show grants, show grants abfrage, index \ohne eine tabelle zu erstellen\ sql, how do i \show grants?\, php mysql \show grants\

Alle Zeitangaben in WEZ +2. Es ist jetzt 06:01 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.