Hallo alle zusammen,
ich quäle mich in letzter Zeit viel mit Datenbankzugriffen rum und mir war das ständige Copy & Paste und das damit verbundene Abändern müssen viel zu blöd auf Dauer. Mittlerweile hab ich für bestimmt zwei dutzend Module mit je mindestens einer DB_Tabelle jeweils select, insert, update, delete usw. -Anfragen erstellt.
Aus diesem Grund hab ich mich entschlossen ein kleines Script zu schreiben, welches alle diese Anfragen quasi selbst erstellt und direkt als Quellcode für PHP ausgibt. Da ich obkjektorientiert arbeite, besteht der generierte Quellcode aus einer Klasse mit je einer Methode für jede Query. Mir ist bewusst, dass die Profis hier wahrscheinlich kein Interesse an dem Script haben, aber mein Gedanke ging auch eher an die Anfänger, die sich mit PDO beschäftigen wollen. Ich biete also hier den Quellcode kostenlos an. Es wäre ja blödsinnig sich so viel Arbeit zu machen und es dann nur für sich selber zu nehmen, wo es doch andere vllt auch brauchen könnten.
Features:
Dieses Script generiert Abfragen. Es erkennt selbstständig die Primary und Unique- Spalten und nutzt sie zur Identifizierung des Datensatzes beispielsweise bei update. Es werden außerdem prepared-stmts generiert, wenn es auswahl- bzw Eingabeparameter gibt. Dabei wird der vorgeschriebene Datentyp der Spalte als Grundlage für den zulässigen Datentyp bei der Funktion bindParam() verwendet und die entsprechende PDO-Konstante eingetragen.
Vorraussetzungen:
Man benötigt dafür min. PHP 5.1 oder neuer mit PDO-Treiber . Natürlich braucht man auch eine Datenbank, sollte klar sein.
Die Tabelle, welche analysiert wird, muss fertig eingerichtet sein, also eine Primary- oder zumindest eine Unique-spalte beinhalten.
Ich nutze immer eine Spalte id als Primary mit auto_increment.
Das Script muss Zugang zur Tabelle bekommen um sie auswerten zu können. Folglich müssen also alle wichtigen (Zugangs-)Daten im Script stehen.
Bemerkungen:
Ich würde mich übrigens sehr über Verbsesserungsvorschläge in der Nutzungsweise von OOP freuen, falls euch irgendetwas auffällt, was definitiv besser geht. Ich entwickle erst seit ca. anderthalb Jahren in php und davon vllt die Hälfte mit OOP, also ist jeder Verbesserungsvorschlag erwünscht und ein Richtungsweiser für mich.
zur Erklärung:
Um das Script zu starten, muss es einfach in einer Datei abgelegt werden, die Zugangsdaten im Script angegeben werden und das Script aufgerufen werden.
Das Script ist jetzt natürlich auf meine Bedürfnisse angepasst. Es baut die Klasse also so, wie ich sie benutze. Das bringt eine Besonderheit mit sich.
Für die Angabe der Tabelle und der Zugangsdaten in der Query benutze ich Variablen der eigen erstellten Config-Klasse.
Das Kürzel , was man in den Einstellungen angeben muss, ist der Variablennamen der Variable der Configklasse, in der der Name für die Tabelle steht.
Auch die Zugangsdaten werden über entsprechende Variablen aus der Configklasse genommen.
Wenn ihr mein Script ohne Abänderung benutzen wollt, dann müsst ihr diese configklasse in das script einfügen, in dem ihr die Vorlagen verwenden wollt. Ihr könnt natürlich auch mein Script zur Erstellung abändern oder den generierten Code jeweils für euch umbauen.
Meine config Klasse sieht so aus:
mit freundlichen Grüßen,
poseidon29
ich quäle mich in letzter Zeit viel mit Datenbankzugriffen rum und mir war das ständige Copy & Paste und das damit verbundene Abändern müssen viel zu blöd auf Dauer. Mittlerweile hab ich für bestimmt zwei dutzend Module mit je mindestens einer DB_Tabelle jeweils select, insert, update, delete usw. -Anfragen erstellt.
Aus diesem Grund hab ich mich entschlossen ein kleines Script zu schreiben, welches alle diese Anfragen quasi selbst erstellt und direkt als Quellcode für PHP ausgibt. Da ich obkjektorientiert arbeite, besteht der generierte Quellcode aus einer Klasse mit je einer Methode für jede Query. Mir ist bewusst, dass die Profis hier wahrscheinlich kein Interesse an dem Script haben, aber mein Gedanke ging auch eher an die Anfänger, die sich mit PDO beschäftigen wollen. Ich biete also hier den Quellcode kostenlos an. Es wäre ja blödsinnig sich so viel Arbeit zu machen und es dann nur für sich selber zu nehmen, wo es doch andere vllt auch brauchen könnten.
Features:
Dieses Script generiert Abfragen. Es erkennt selbstständig die Primary und Unique- Spalten und nutzt sie zur Identifizierung des Datensatzes beispielsweise bei update. Es werden außerdem prepared-stmts generiert, wenn es auswahl- bzw Eingabeparameter gibt. Dabei wird der vorgeschriebene Datentyp der Spalte als Grundlage für den zulässigen Datentyp bei der Funktion bindParam() verwendet und die entsprechende PDO-Konstante eingetragen.
Vorraussetzungen:
Man benötigt dafür min. PHP 5.1 oder neuer mit PDO-Treiber . Natürlich braucht man auch eine Datenbank, sollte klar sein.
Die Tabelle, welche analysiert wird, muss fertig eingerichtet sein, also eine Primary- oder zumindest eine Unique-spalte beinhalten.
Ich nutze immer eine Spalte id als Primary mit auto_increment.
Das Script muss Zugang zur Tabelle bekommen um sie auswerten zu können. Folglich müssen also alle wichtigen (Zugangs-)Daten im Script stehen.
Bemerkungen:
Ich würde mich übrigens sehr über Verbsesserungsvorschläge in der Nutzungsweise von OOP freuen, falls euch irgendetwas auffällt, was definitiv besser geht. Ich entwickle erst seit ca. anderthalb Jahren in php und davon vllt die Hälfte mit OOP, also ist jeder Verbesserungsvorschlag erwünscht und ein Richtungsweiser für mich.
zur Erklärung:
Um das Script zu starten, muss es einfach in einer Datei abgelegt werden, die Zugangsdaten im Script angegeben werden und das Script aufgerufen werden.
Das Script ist jetzt natürlich auf meine Bedürfnisse angepasst. Es baut die Klasse also so, wie ich sie benutze. Das bringt eine Besonderheit mit sich.
Für die Angabe der Tabelle und der Zugangsdaten in der Query benutze ich Variablen der eigen erstellten Config-Klasse.
Das Kürzel , was man in den Einstellungen angeben muss, ist der Variablennamen der Variable der Configklasse, in der der Name für die Tabelle steht.
Auch die Zugangsdaten werden über entsprechende Variablen aus der Configklasse genommen.
Wenn ihr mein Script ohne Abänderung benutzen wollt, dann müsst ihr diese configklasse in das script einfügen, in dem ihr die Vorlagen verwenden wollt. Ihr könnt natürlich auch mein Script zur Erstellung abändern oder den generierten Code jeweils für euch umbauen.
Meine config Klasse sieht so aus:
PHP-Code:
class config
{
// ==== SQL-Einstellungen ====
// SQL-Zugangsdaten
public static $sql_host_PDO ='mysql:host=localhost;dbname=db_name';
public static $sql_user ="root";
public static $sql_pw ="passwort";
public function __construct()
{
// Namen für die SQL-Tabellen
$this->sql_table_kuerzel ="tabellen_name""; // fuer kuerzel muss also name der variable hin bzw. die angabe im script unten
}
}
mit freundlichen Grüßen,
poseidon29
PHP-Code:
<?php
$db_name = "db_name"; // Datenbankname
$host = "localhost"; // Host, im normalfall localhost
$db_user = "root"; // username
$db_pw = "passwort"; // passwort
$db_table = "tabellen_name"; // tabellenname, für den die vorlagen erstellt werden
$db_table_kurz = "kuerzel"; // tabellenkuerzel , siehe post im Forum zur erklaerung
$ac = new accesser($db_name, $host, $db_user, $db_pw, $db_table, $db_table_kurz);
$text = $ac->access();
echo"
<pre align=left>
".$text."
</pre>
";
class accesser {
public function __construct($db_name, $host, $db_user, $db_pw, $db_table, $db_table_kurz)
{
$host_pdo = "mysql:host=".$host.";dbname=".$db_name;
$this-> pdo = new PDO
(
$host_pdo,
$db_user,
$db_pw
);
$this-> db_table = $db_table;
$this->table_kurz = $db_table_kurz;
$this->pri = array();
$this->uni = array();
$query = "SHOW COLUMNS FROM `".$this-> db_table."`";
$stmt = $this->pdo -> query ($query);
$data = $stmt -> fetchAll(PDO::FETCH_ASSOC);
foreach($data AS $key=>$row)
{
$data[$row['Field']]= $row;
if($row['Key']=="PRI")
array_push($this->pri, $row);
if($row['Key']=="UNI")
array_push($this->uni, $row);
unset($data[$key]);
}
$this->col_data = $data;
//echo"<pre align=left>";
//print_r($data);
//echo"</pre>";
}
public function access()
{
$text = "";
$text .= $this->class_open();
$text .= $this->select_all();
$text .= $this->select_by_param();
$text .= $this->update();
$text .= $this->insert();
$text .= $this->delete();
$text .= $this->truncate();
$text .= $this->class_close();
return $text;
}
public function select_all()
{
$text = "
public function select_all()
{
\$pdo= new PDO
(
config::\$sql_host_PDO,
config::\$sql_user,
config::\$sql_pw
);
\$query = 'SELECT * FROM `'.\$this->".$this->table_kurz.".'` ';
\$stmt = \$pdo -> query (\$query);
\$data = \$stmt -> fetchAll(PDO::FETCH_ASSOC);
return \$data;
}
";
return $text;
}
public function select_by_param()
{
$text = "
public function select_by_param(";
$i=1;
$max = count($this->col_data);
foreach($this->col_data AS $key=>$col)
{
if($i<$max)
$text.= "\$".$key.", " ;
elseif($i = $max)
$text.= "\$".$key." " ;
$i++;
}
$text.=")
{
\$pdo= new PDO
(
config::\$sql_host_PDO,
config::\$sql_user,
config::\$sql_pw
);
\$query = 'SELECT * FROM `'.\$this->".$this->table_kurz.".'` WHERE ";
$i=1;
foreach($this->col_data AS $key=>$col)
{
if($i<$max)
$text.= "`".$key."`= ? AND " ;
elseif($i = $max)
$text.= "`".$key."`= ? ';" ;
$i++;
}
$text.="
\$stmt = \$pdo -> prepare (\$query);
";
$i=1;
$max = count($this->col_data);
foreach($this->col_data AS $key=>$col)
{
if($col['Type']== 'int(11)' OR $col['Type']== 'tinyint')
$option = "INT";
else
$option = "STR";
$text.= "\$stmt -> bindParam(".$i." , \$".$key." , PDO::PARAM_".$option.");
" ;
$i++;
}
$text.= "
\$stmt -> execute();
\$data = \$stmt -> fetchAll(PDO::FETCH_ASSOC);
return \$data;
}
";
return $text;
}
public function update()
{
// FUNCTION starten========
$text = "
public function update(";
//PARAMETER ================
$i=1;
$max = count($this->col_data);
foreach($this->col_data AS $key=>$col)
{
if($i<$max)
$text.= "\$".$key.", " ;
elseif($i = $max)
$text.= "\$".$key."" ;
$i++;
}
if(!empty($this->pri))
{
foreach($this->pri AS $col)
$text.=", \$".$col['Field']."_primary ";
}elseif(!empty($this->uni))
{
$i=1;
foreach($this->uni AS $col)
{
if($i==1)
$text.=", ".$col['Field']."_unique";
else
$text.=", ".$col['Field']."_unique ";
$i++;
}
}
// NEW PDO und QUERY================
$text.=")
{
\$pdo= new PDO
(
config::\$sql_host_PDO,
config::\$sql_user,
config::\$sql_pw
);
\$query = 'UPDATE `'.\$this->".$this->table_kurz.".'`";
// SET =========
$text.="
SET (";
$i=1;
foreach($this->col_data AS $key=>$col)
{
if($i<$max)
$text.= "`".$key."`, " ;
elseif($i = $max)
$text.= "`".$key."` )" ;
/*
"UPDATE `".$this->sql_table_news."`
SET `name`=?,
`inhalt`=?,
`sicht`=?,
`erstellung`=?,
`verfall`=?,
`user_id`=?
WHERE `id`= ?";
*/
$i++;
}
//VALUES ==========
$text.="
VALUES (";
$i=1;
foreach($this->col_data AS $key=>$col)
{
if($i<$max)
$text.= "?, " ;
elseif($i = $max)
$text.= "? )" ;
$i++;
}
//WHERE =========
$text.="
WHERE ";
if(!empty($this->pri))
{
foreach($this->pri AS $col)
$text.="`".$col['Field']."` = ?";
}elseif(!empty($this->uni))
{
$i=1;
foreach($this->uni AS $col)
{
if($i==1)
$text.= "`".$col['Field']."` = ?";
else
$text.="AND `".$col['Field']."` = ?";
$i++;
}
}
// CLOSE query
$text.="
';
";
// prepare=================
$text.="
\$stmt = \$pdo -> prepare (\$query);
";
// BIND PARAM ==============
$i=1;
$max = count($this->col_data);
foreach($this->col_data AS $key=>$col)
{
if($col['Type']== 'int(11)' OR $col['Type']== 'tinyint')
$option = "INT";
else
$option = "STR";
$text.= "\$stmt -> bindParam(".$i." , \$".$key." , PDO::PARAM_".$option.");
" ;
$i++;
}
if(!empty($this->pri))
{
foreach($this->pri AS $key=>$col)
if($col['Type']== 'int(11)' OR $col['Type']== 'tinyint')
$option = "INT";
else
$option = "STR";
$text.= "\$stmt -> bindParam(".$i." , \$".$col['Field']."_primary , PDO::PARAM_".$option.");";
$i++;
}elseif(!empty($this->uni))
{
foreach($this->uni AS $key=>$col)
{
if($col['Type']== 'int(11)' OR $col['Type']== 'tinyint')
$option = "INT";
else
$option = "STR";
$text.= "\$stmt -> bindParam(".$i." , \$".$col['Field']."_unique , PDO::PARAM_".$option.");";
$i++;
}
}
// ENDING=================
$text.= "
\$stmt -> execute();
\$data = \$stmt -> fetchAll(PDO::FETCH_ASSOC);
return \$data;
}
";
return $text;
}
public function insert()
{
$text = "
public function insert(";
$i=1;
$max = count($this->col_data);
foreach($this->col_data AS $key=>$col)
{
if($col['Extra']!='auto_increment')
{
if($i<$max)
$text.= "$".$key.", " ;
elseif($i = $max)
$text.= "$".$key." )" ;
}
$i++;
}
$text.="
{
\$pdo= new PDO
(
config::\$sql_host_PDO,
config::\$sql_user,
config::\$sql_pw
);
\$query = 'INSERT INTO `'.\$this->".$this->table_kurz.".'` ";
// SET =========
$text.="
(";
$i=1;
foreach($this->col_data AS $key=>$col)
{
if($col['Extra']=='auto_increment')
{
if($i<$max)
$text.= "`".$key."`, " ;
elseif($i = $max)
$text.= "`".$key."` )" ;
}else{
if($i<$max)
$text.= "`".$key."`, " ;
elseif($i = $max)
$text.= "`".$key."` )" ;
}
$i++;
}
// VALUES ==========
$text.="
VALUES
(";
$i=1;
foreach($this->col_data AS $key=>$col)
{
if($col['Extra']=='auto_increment')
{
if($i<$max)
$text.= "NULL, " ;
elseif($i = $max)
$text.= "NULL )" ;
}else{
if($i<$max)
$text.= "?, " ;
elseif($i = $max)
$text.= "? )';" ;
}
$i++;
}
$text.="
\$stmt = \$pdo -> prepare (\$query);
";
$i=1;
foreach($this->col_data AS $key=>$col)
{
if($col['Extra']!='auto_increment')
{
if($col['Type']== 'int(11)' OR $col['Type']== 'tinyint')
$option = "INT";
else
$option = "STR";
$text.= "\$stmt -> bindParam(".$i." , \$".$key." , PDO::PARAM_".$option.");
" ;
$i++;
}
}
$text.="
\$stmt -> execute ();
}
";
return $text;
}
public function delete()
{
$text = "
public function delete(";
$i=1;
$max = count($this->col_data);
if(!empty($this->pri))
{
foreach($this->pri AS $col)
{
if($i==1)
$text.="$".$col['Field']."_primary";
else
$text.=", $".$col['Field']."_primary";
$i++;
}
}elseif(!empty($this->uni))
{
$i=1;
foreach($this->uni AS $col)
{
if($i==1)
$text.="$".$col['Field']."_unique";
else
$text.=", $".$col['Field']."_unique ";
$i++;
}
}
$text.=")
{
\$pdo= new PDO
(
config::\$sql_host_PDO,
config::\$sql_user,
config::\$sql_pw
);
\$query = 'DELETE FROM `'.\$this->".$this->table_kurz.".'` WHERE ";
// WHERE ====================
$i=1;
if(!empty($this->pri))
{
foreach($this->pri AS $key=>$col)
{
if($i=1)
$text.= "`".$col['Field']."`= ?";
else
$text.= "AND `".$col['Field']."`= ?";
$i++;
}
}elseif(!empty($this->uni))
{
foreach($this->uni AS $key=>$col)
{
if($i=1)
$text.= "`".$col['Field']."`= ?";
else
$text.= "AND `".$col['Field']."`= ?";
$i++;
}
}
$text.="';
\$stmt = \$pdo -> prepare (\$query);
";
// BIND PARAM ================================
$i=1;
if(!empty($this->pri))
{
foreach($this->pri AS $key=>$col)
{
if($col['Type']== 'int(11)' OR $col['Type']== 'tinyint')
$option = "INT";
else
$option = "STR";
$text.= "\$stmt -> bindParam(".$i." , \$".$col['Field']."_primary , PDO::PARAM_".$option.");";
$i++;
}
}elseif(!empty($this->uni))
{
foreach($this->uni AS $key=>$col)
{
if($col['Type']== 'int(11)' OR $col['Type']== 'tinyint')
$option = "INT";
else
$option = "STR";
$text.= "\$stmt -> bindParam(".$i." , \$".$col['Field']."_unique , PDO::PARAM_".$option.");";
$i++;
}
}
$text.="
\$stmt -> execute();
}
";
return $text;
}
public function truncate()
{
$text = "
public function truncate()
{
\$pdo= new PDO
(
config::\$sql_host_PDO,
config::\$sql_user,
config::\$sql_pw
);
\$query = 'TRUNCATE `'.\$this->".$this->table_kurz.".'` ';
\$stmt = \$pdo -> query (\$query);
}
";
return $text;
}
private function class_open()
{
$text =
"
class new_class extends config
{
";
return $text;
}
private function class_close()
{
$text =
"
}
";
return $text;
}
}
?>
Kommentar