Author Topic: [TUTORIAL] SQL -> ckecken, ob eine Spalte in einer Tabelle existiert  (Read 12183 times)

Offline Stefek

  • Posts: 6177
  • Gender: Male
  • ("ړ)
Hi, manchmal will man in einem Modul zuerst schauen, ob eine bestimmte Spalte existiert, bevor man mit dem Code weiter fährt (zur Laufzeit des Moduls).

Dieses Snippet schaut nach, ob in der Tabelle `'.TABLE_PREFIX.'pages` die Spalte `rewrite_url`existiert.

Code: [Select]
<?php

//  CHECK if the COLUMN `rewrite_url` exists in the `pages` TABLE
$checkDbTable $database->query("SHOW COLUMNS FROM `".TABLE_PREFIX."pages` LIKE 'rewrite_url'");
$rewrite_url_exists $checkDbTable->numRows() > TRUE FALSE;


Ergibt TRUE / FALSE, je nachdem, ob die Spalte existiert.

Dies kann auf viele Arten hilfreich sein.
Auch bei Upgrade Scripts von Modulen, um zunächst nachzuschauen, ob bestimmte Tabellen-Spalten existieren, bevor man sie nachinstalliert.
Aber auch bei einigen Patches, wo man sicherstellen will, dass keine Komplikationen mit dem Code entstehen und man ein "Fallback" anbieten will - für den Fall das bestimmte Spalten nicht vorhanden sind.

Gruß,
Stefek
"Gemeinsam schafft man mehr."

gemeinsam
1. mehreren Personen oder Dingen in gleicher Weise gehörend, eigen
2. in Gemeinschaft [unternommen, zu bewältigen]; zusammen, miteinander
#Duden

Offline Luisehahne

  • WebsiteBaker Org e.V.
  • **
  • Posts: 4359
  • Gender: Male
    • Webdesign und Entwicklung WebsiteBaker
Re: [TUTORIAL] SQL -> ckecken, ob eine Spalte in einer Tabelle existiert
« Reply #1 on: January 31, 2012, 06:30:37 PM »
Geht auch einfacher. Im code folgendes eingeben

Code: [Select]
if($database->field_exists($table_name, $field_name) ) { ......
Dietmar
Immer nur von der Zukunft reden, die Gegenwart vergessen und auf die Vergangenheit schimpfen
Neues Unwort: Schnappatmung

Offline DarkViper

  • Forum administrator
  • *****
  • Posts: 3021
  • Gender: Female
Re: [TUTORIAL] SQL -> ckecken, ob eine Spalte in einer Tabelle existiert
« Reply #2 on: January 31, 2012, 06:39:42 PM »
Ok etwas ausführlicher, Dietmars Bemerkung war doch etwas kurz und knapp. ;-)

eventuell hilft auch ein kurzer Blick in die Klasse 'database'.

Code: [Select]
<?php

//  CHECK if the COLUMN `rewrite_url` exists in the `pages` TABLE

$rewrite_url_exists $database->field_exists(TABLE_PREFIX.'pages''rewrite_url');

?>

Diese Methode (und noch eine ganze Reihe anderer) steht bereits seit Revision 1362 vom 29.12.2010 zur Verfügung. Diese und auch alle anderen neuen Methoden in dieser und anderen Klassen sind PHP-Dokumentor-kompatibel in den Klassen dokumentiert.

Neue Methoden der Klasse database (aus class.database.php):

bool database::field_exists ( string $table_name, string $field_name );
bool database::field_add ( string $table_name, string $field_name, string $description )
bool database::field_modify ( string $table_name, string $field_name, string $description )
bool database::field_remove ( string $table_name, string $field_name )
bool database::index_exists ( string $table_name, string $index_name, int $number_fields = 0 )
bool database::index_add ( string $table_name, string $index_name, $string field_list, $string index_type = '' )
bool database::index_remove ( string $table_name, string $index_name )

Neue Methoden der Klasse mysql (aus class.database.php):
Quote
Beide Methoden sind optimal für das Paging geeignet.
rewind() spult den Zeiger einer Abfragemenge zurück zum ersten Datensatz, nachdem bereits beliebig viele Sätze per fetchRow() ausgelesen wurden.
seekRow(20) setzt den Zeiger auf den 21. Datensatz einer Abfragemenge, so dass nachfolgende Aufrufe von fetchRow() die Datensätze ab diesem 21. Datensatz auslesen.(Der erste Datensatz hat die Nummer 0!)

bool mysql::seekRow ( int $position = 0 )
bool mysql::rewind(void)


Gelegentlich ein Blick in das CANGELOG kann da oft hilfreich sein. ;-)
« Last Edit: January 31, 2012, 11:33:40 PM by DarkViper »
Der blaue Planet - er ist nicht unser Eigentum - wir haben ihn nur von unseren Nachkommen geliehen

"You have to take the men as they are… but you can not leave them like that !" :-P
Das tägliche Stoßgebet: Oh Herr, wirf Hirn vom Himmel !

Offline Stefek

  • Posts: 6177
  • Gender: Male
  • ("ړ)
Re: [TUTORIAL] SQL -> ckecken, ob eine Spalte in einer Tabelle existiert
« Reply #3 on: January 31, 2012, 08:00:54 PM »
Danke.
Gelegentlich ein Blick in das CANGELOG kann da oft hilfreich sein. ;-)
Wenn die Klassen geändert werden habe ich nicht so einen guten Eindruck, wenn es nicht dokumentiert wird.
Ich "kleiner Anwender", der nicht einmal ein "Developer" ist, soll den Core durchwühlen um neue Methoden ausfindig zu machen?

pwehhh.

Heißt es jetzt, dass mein Modul nicht auf die Repo kommt, weil ich nicht die adäquate Methode verwende?  :evil:

So, für heute habe ich es Euch genug gegeben  8-)
"Gemeinsam schafft man mehr."

gemeinsam
1. mehreren Personen oder Dingen in gleicher Weise gehörend, eigen
2. in Gemeinschaft [unternommen, zu bewältigen]; zusammen, miteinander
#Duden

Offline Luisehahne

  • WebsiteBaker Org e.V.
  • **
  • Posts: 4359
  • Gender: Male
    • Webdesign und Entwicklung WebsiteBaker
Re: [TUTORIAL] SQL -> ckecken, ob eine Spalte in einer Tabelle existiert
« Reply #4 on: February 01, 2012, 03:26:20 AM »
Quote
Ich "kleiner Anwender", der nicht einmal ein "Developer" ist

Naja, du weisst schon, dass mich deine Arbeit begeistert hat und du das Angebot hattest an der 2.9er mitzuwirken. Sei nicht so bescheiden.

Dietmar
Immer nur von der Zukunft reden, die Gegenwart vergessen und auf die Vergangenheit schimpfen
Neues Unwort: Schnappatmung

Offline kweitzel

  • WebsiteBaker Org e.V.
  • **
  • Posts: 6983
  • Gender: Male
Re: [TUTORIAL] SQL -> ckecken, ob eine Spalte in einer Tabelle existiert
« Reply #5 on: February 02, 2012, 07:44:15 AM »
Der Off-Topic Teil ist jetzt hier zu finden, hier kann über das Tutorial weiterdiskutiert werden.

Gruß

Klaus

Offline Stefek

  • Posts: 6177
  • Gender: Male
  • ("ړ)
Re: [TUTORIAL] SQL -> ckecken, ob eine Spalte in einer Tabelle existiert
« Reply #6 on: February 02, 2012, 04:24:12 PM »
Hallo Klaus,

erstmal danke für die Stellungnahme in dem nun aufgespliteten Thread. Da kann ich jetzt leider nicht mehr drauf antworten.
(Du kannst das hier gerne ausschneiden und dort wieder einfügen.)

Aber das hier war Deine Aussage:
Quote
Folgendes ist der aktuelle Aktionsplan:

1) SVN wird wieder öffentlich, auf einer WB URL und per HTTP ansprechbar (Max. 2 Wochen)

2) Die Projektseite wird wieder mit Leben gefüllt und aus der "Privatversenkung" herausgeholt (Max. 2 Wochen)

3) Auf der Projektseite wird es wieder einen Download Link geben, mit dem das aktuelle Paket als ZIP heruntergeladen werden kann (Max. 2 Wochen)

4) Add-On Showcase: Mein Verständnis der heutigen Aussagen war das der NL User Boudi und NorHei sich zusammentun und dem Modul Showcase mit Ruuds Modul neues Leben einhauchen, dazu hat NorHei das Modul von Ruud bekommen. Wird da was passieren?

5) Template Showcase: Wir suchen jemanden, der sich den Templates annimmt. Stefek, das wäre doch was für Dich als Designer.

6) Ein kleiner Fix wird für 2.8.3 noch erstellt und dann wird veröffentlicht (Max. 3 Tage)

7) Development Guidelines werden innerhalb von 1 Monat fertig gestellt und dann interessierten Testlesern zur Verfügung gestellt. Es wird noch geklärt, wie und wo dies geschieht (Forum, Projektseite, SVN ...)

Natürlich haben die oben genannten Änderungen auch Nachteile, z.B. dass Ihr nicht immer eine funktionierende Version im SVN bekommt ... da gibt es dann auch Tage wo die letzte Version NICHT funktioniert, aber dafür kann der interessierte Nutzer die Entwicklung nachvollziehen.

Zu punkt 6, Veröffentlichung 2.8.3:
Was total von der ursprünglichen Herangehensweise vom WB Projekt abweicht, ist die künstliche Bemühung, eine Stable herauszugeben.
Man kann sehr schwer eine Stable rausgeben, wo die einzigen Tester eine Handvoll unterhalb der Kathedrale Auserwählter sind.
Kehrt bitte zum ursprünglichen Konzept mit Alpha/Beta/RC/Final zurück (Stable ist eh eine Pharse in der Programmierung).

Zu Punkt 4, Add-Ons Repository:
Ein Modul existiert. Und ein neues Modul zu schreiben stellt kein Problem dar.
Wichtiger als das Modul selbst, sind die Kriterien, per denen man die Module klassifiziert.
Vor gut über einem halben Jahr wurde mit DarkViper besprochen, dass etwas in dieser Art möglich wäre:
[] Standardgemäße Backend-Optik (fügt sich standardgemäß in das ausgewählte WB Theme ein)
[][] Logik und Optik getrennt (Frontend/Backend)
[] Sicherheitsempfehlu ngen (FTAN, ...)
[] Verwendet Standard Klassen von WB
[] Ist nicht auf externe Libs angewiesen
[] Frontend Edit fähig (Zukunftsmusik)

Meiner pers. Einschätzung nach, ist es oft egal, ob all die obigen Punkte ERFÜLLT sind. Sie sagen wenig über die NÜTZLICHKEIT eines Moduls aus. ABER es zeigt zumindest an, ob das Modul an die WB Konzepte anschließt oder eigene Libs usw. benötigt.
Oft gibt es Module mit Abhängigkeiten (externe Lib, Template Engine etc.)
Dies sollte kein Grund sein, Module NICHT zu LISTEN.
Module sollten gelistet werden, so viele wie möglich, ES SEI DENN, sie stellen ein wirklich GROBES Risiko dar.
Ein Link zum Forum eines Moduls enthüllt dann mehr zum jenen Modul.
Zusätzlich noch kleines Bild für Module Übersicht und je nach Bedarf größere Bilder für die Modul Detailansicht.
Ich bin der Auffassung, alle Module sollten eine Detailansicht haben - ähnlich wie auf AMASP, nur eben besser.


Zu Punkt 5, Templates:
Quote
Template Showcase: Wir suchen jemanden, der sich den Templates annimmt. Stefek, das wäre doch was für Dich als Designer.
Wenn die Repository steht und die Route klar ist, wie neue Templates in die Repo aufgenommen werden können, kann ich gerne ein Paar meiner Templates mit zur Aufnahme vorschlagen.
Ansonsten weiß ich nicht, was ich da soll? Die Templates, die jetzt da sind, sind zwar alt, aber was soll denn da modernisiert werden? Besser neue Templates neuer Designer nehmen. Auch wenn man erstmal eine kleine Liste an DOs & DON'Ts zur Verfügung stellen müßte, um den Designern mit zu teilen, was ein Template "akzeptabel" macht.

Zu Punkt 1,2 und 3, Projektseite und SVN:
Ähnlich wie andere würde ich vorschlagen, WB auf GitHub zu stellen.
Das spart erstmal Kosten,
ist eine zusätzliche Werbung über GitHub selbst
und jeder der mitentwickeln will, kann sich das Teil komplett forken und wenn da Brauchbares bei ist, kann es viel besser in den offiziellen Strang aufgenommen werden.


Am Wichtigsten für das Projekt aber zu wissen ist, was geplant ist und auch zu wissen, mit welchen Zeiträumen hier zu rechnen ist.
Die Idee WB als Framework komplett von der Anwendung selbst zu lösen ist natürlich eine gute Idee, aber das ist eine separate Entwicklung und sie sollte nicht die jetzige Entwicklung beeinträchtigen.
Es scheint, als wenn hier nicht multidimensional gedacht werden könnte - d.h. ab vom linearen Denken in mehrschichtiges, paralleles Denken, welches Entwicklungen ermöglicht, die sich später zu einem ganzen zusammen fügen.

Viele der heutigen OS Projekte arbeiten mit Branches, nur hier wurde das irgendwann vernachläßigt.


Gruß,
Stefek
"Gemeinsam schafft man mehr."

gemeinsam
1. mehreren Personen oder Dingen in gleicher Weise gehörend, eigen
2. in Gemeinschaft [unternommen, zu bewältigen]; zusammen, miteinander
#Duden

Offline BlackBird

  • Posts: 2573
Re: [TUTORIAL] SQL -> ckecken, ob eine Spalte in einer Tabelle existiert
« Reply #7 on: February 02, 2012, 04:59:03 PM »
FORKEN??? PFUI!!!

Offline Stefek

  • Posts: 6177
  • Gender: Male
  • ("ړ)
Re: [TUTORIAL] SQL -> ckecken, ob eine Spalte in einer Tabelle existiert
« Reply #8 on: February 02, 2012, 05:26:12 PM »
FORKEN??? PFUI!!!
Nur weil Leute begriffliche Aversionen haben, musst Du das nicht auch noch ins Lächerliche ziehen  :-P
"Gemeinsam schafft man mehr."

gemeinsam
1. mehreren Personen oder Dingen in gleicher Weise gehörend, eigen
2. in Gemeinschaft [unternommen, zu bewältigen]; zusammen, miteinander
#Duden

Offline easyuser

  • Posts: 832
Re: [TUTORIAL] SQL -> ckecken, ob eine Spalte in einer Tabelle existiert
« Reply #9 on: February 02, 2012, 08:32:56 PM »
[OT zu oben]

Quote
Natürlich haben die oben genannten Änderungen auch Nachteile, z.B. dass Ihr nicht immer eine funktionierende Version im SVN bekommt ... da gibt es dann auch Tage wo die letzte Version NICHT funktioniert, aber dafür kann der interessierte Nutzer die Entwicklung nachvollziehen.

Nur zum Verständnis: Das ist auch genau der Sinn einer SVN (oder Git oder sonstiges). Eine SVN soll niemals produktiv eingesetzt werden. Daher sollte auch endlich einmal wieder die Revisionsnummer für den Benutzer keine Rolle mehr spielen. Der geneigte Tester kann sie ja jederzeit herausfinden. Ob das .zip hier überhaupt anzubieten ist, sei einmal dahingestellt.

Ein ganz wichtiges Tool (warum nicht gleich für die 2.8.3?) wäre zudem, endlich einmal Systeminformationen zentral bereitstellen. Das ewige "mach dir eine phpinfo() und guck nach was faul ist" kapiert kaum ein Benutzer.
Das kann man als .txt oder sonstwas herunterladen, ins Forum hereinhängen (vielleicht sogar als Pflicht bei Supportanfragen) und viele Zeitverzögerungen wären weg. Ein Beispiel wäre ein Admin-Tool oder - besser - integriert in den Optionen. Dazu benötigt es keinerlei /framework Änderungen.
Im übrigen habe ich nirgends erwähnt, dass ich das nicht selbst bereitstellen kann. Nur für die Katze - wie so vieles in der Vergangenheit - mache ich es nicht.
Man zähle nur einmal die "Nachfragebeiträge" zusammen. Übrigens auch ein Bereich von Projektmanagement.

PS: Kleiner Bug hat sich in Redmine eingeschlichen - bei Klick auf ein Objekt unter "Aktivität" kommt ein 500er. Hatte ein ähnliches Problem einmal, weiß aber leider nicht mehr was die Ursache war - logs helfen weiter.

[/OT zu oben]

Offline kweitzel

  • WebsiteBaker Org e.V.
  • **
  • Posts: 6983
  • Gender: Male
Re: [TUTORIAL] SQL -> ckecken, ob eine Spalte in einer Tabelle existiert
« Reply #10 on: February 02, 2012, 09:11:36 PM »
Danke für den Fehlerbericht zu Redmine. Liegt am Remote Repository ...

Gruß

Klaus
« Last Edit: February 02, 2012, 09:15:20 PM by kweitzel »

Offline easyuser

  • Posts: 832
Re: [TUTORIAL] SQL -> ckecken, ob eine Spalte in einer Tabelle existiert
« Reply #11 on: February 03, 2012, 03:29:11 PM »
Danke für den Fehlerbericht zu Redmine. Liegt am Remote Repository ...
Ich weiß nicht, wie weit du dich mit SVN auskennst, daher kurzer Hinweis.
Das Umziehen einer Remote SVN auf einen anderen Server ist recht einfach.
Einfach svn installieren (CentOS hat es z.B. schon dabei).
Danach initialisieren und svnsync ausführen, beschrieben z.B. hier http://www.thoughtspark.org/node/10

Alternative dazu ist eben Git (oder der Webdienst Github dazu) - hier gibt es kein Remote und lokal mehr. Die Repository hat jeder lokal bei sich und synchronisiert nur noch mit dem Master. Aus dem Betriebsalltag weiß aber, dass Git nicht nur Vorteile bringt - gute Datensicherung ist Pflicht.  :evil:

Offline DarkViper

  • Forum administrator
  • *****
  • Posts: 3021
  • Gender: Female
Re: [TUTORIAL] SQL -> ckecken, ob eine Spalte in einer Tabelle existiert
« Reply #12 on: February 03, 2012, 04:22:15 PM »
>> Liegt am Remote Repository ...

100% negativ. Liegt eindeutig am Redmine-Client.
Das SVN-Repo läuft seit >6 Monaten stabil und es wird seither täglich mit verschiedensten Clients darauf gearbeitet. Auch ein Redmine-Client auf einem anderen Server arbeitet anstandslos damit zusammen.
Der blaue Planet - er ist nicht unser Eigentum - wir haben ihn nur von unseren Nachkommen geliehen

"You have to take the men as they are… but you can not leave them like that !" :-P
Das tägliche Stoßgebet: Oh Herr, wirf Hirn vom Himmel !

Offline kweitzel

  • WebsiteBaker Org e.V.
  • **
  • Posts: 6983
  • Gender: Male
Re: [TUTORIAL] SQL -> ckecken, ob eine Spalte in einer Tabelle existiert
« Reply #13 on: February 03, 2012, 04:50:10 PM »
Auch ein Redmine-Client auf einem anderen Server arbeitet anstandslos damit zusammen.

OK, Du hast dich ja damit befasst. Das Fehler-Log hat mir gesagt, dass der Remote Server nicht verfügbar ist ...

[EDIT]
Nehme alles zurück, das muss ein alter Fehler gewesen sein. Die DB Migration für das 1.3er Upgrade war nicht richtig durchgelaufen. Das ist jetzt behoben. Ihr könnt wieder testen. Bitte sagt Bescheid, ob nochwas auffällt. Danke!
[/EDIT]

Gruß

Klaus
« Last Edit: February 03, 2012, 05:01:31 PM by kweitzel »

Offline Stefek

  • Posts: 6177
  • Gender: Male
  • ("ړ)
Re: [TUTORIAL] SQL -> ckecken, ob eine Spalte in einer Tabelle existiert
« Reply #14 on: February 03, 2012, 08:27:59 PM »
OK,
zurück zum Topic.
Datenbank Methoden der Klasse database.

Ich habe mir eine Funktion gebaut, die ein ganzes Array verarbeitet und in die DB schreibt.
Die Funktion geht etwa so:

Code: [Select]
<?phpif (!function_exists('update_query_from_array')){
/**
 * update_query_from_array
 * -----------------------
 * @author  Christian M. Stefan <stefek@designthings.de>
 * @date   2011. 07. 25
 *
 * @param string $field_name  - field name for WHERE clause
 * @param string $table_name  - table name to be used for the query
 * @param int  $id  - id to use as unique key (may be $item_id, $section_id etc.)
 * @param array $arr_Update  - prepared Array of field-names and values to be updated in table
 *
 * @return executes a database query
 */
function update_query_from_array($table_name = FALSE, $field_name = '', $id = NULL, $arr_Update = array())
{
if ( isset($table_name) && sizeof($arr_Update > 0 )&& !empty($field_name) && !is_null($id) ) 
{
global $database;
$i = 0;
$prepared_update_query = "UPDATE `".$table_name."` SET ";
foreach ($arr_Update as $field => $value)
{
// skip comma at first field
if ($i != 0)
$prepared_update_query .= ", "; // add comma after any $field => $value pairs
$prepared_update_query .= "`".$field."` =  '".$value."' ";
$i++;
}
$prepared_update_query .=" WHERE `".$field_name."` = '".intval($id)."'";
// execute the UPDATE query
return $database->query( $prepared_update_query );
}
}

}

Gibts sowas auch?
Habe es auf der Dokumentationsseite auch nicht gefunden.
Mein Code sieht etwas komisch aus, aber tut den Job gut.
Wenn es aber was gibt, kann ich dadrauf umsteigen.



Gruß,
Stefek
« Last Edit: February 03, 2012, 08:29:33 PM by Stefek »
"Gemeinsam schafft man mehr."

gemeinsam
1. mehreren Personen oder Dingen in gleicher Weise gehörend, eigen
2. in Gemeinschaft [unternommen, zu bewältigen]; zusammen, miteinander
#Duden

Offline Stefek

  • Posts: 6177
  • Gender: Male
  • ("ړ)
Re: [TUTORIAL] SQL -> ckecken, ob eine Spalte in einer Tabelle existiert
« Reply #15 on: February 03, 2012, 08:32:48 PM »
Zur Verdeutlichung,
die Idee ist einfach, zunächst ein Array zu erstellen

Code: [Select]
<?php
$arr_Update 
= array(
'description'    => $admin->add_slashes(str_replace($friendly$raw$_POST['description'])),
'keywords'     => $admin->add_slashes(str_replace($friendly$raw$_POST['keywords'])),
'page_title'     => $admin->add_slashes(str_replace($friendly$raw$_POST['page_title'])),
'menu_title'    => $admin->add_slashes(str_replace($friendly$raw$_POST['menu_title']))
);


und anschließend die Methode (bzw. in meinem Falle die Funktion) aufzurufen:
Code: [Select]
<?php 
update_query_from_array
(TABLE_PREFIX.'pages''page_id'$page_id$arr_Update);

Gruß,
Stefek
« Last Edit: February 03, 2012, 08:35:25 PM by Stefek »
"Gemeinsam schafft man mehr."

gemeinsam
1. mehreren Personen oder Dingen in gleicher Weise gehörend, eigen
2. in Gemeinschaft [unternommen, zu bewältigen]; zusammen, miteinander
#Duden

 

postern-length