Welcome, Guest. Please login or register.
Did you miss your activation email?
May 27, 2012, 01:01:15 AM

Login with username, password and session length
Search:     Advanced search
Wollen Sie dem WebsiteBaker Team beitreten?
Nähere Informationen finden Sie unter hier und auf unserer neuen Webseite.
155557 Posts in 21715 Topics by 7737 Members
Latest Member: gx-world
* Home Help Search Login Register
Pages: [1]   Go Down
Print
Author Topic: [TUTORIAL] SQL -> ckecken, ob eine Spalte in einer Tabelle existiert  (Read 767 times)
Stefek
WebsiteBaker Org e.V.

Offline Offline

Posts: 4884



« on: January 31, 2012, 01:38:49 PM »

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:
<?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
Logged

"In a time of universal deceit, telling the truth becomes a revolutionary act."
- George Orwell, Nineteen eighty-four (1984)
Luisehahne
Board Member
Development Team
*****
Offline Offline

Posts: 3147



WWW
« Reply #1 on: January 31, 2012, 06:30:37 PM »

Geht auch einfacher. Im code folgendes eingeben

Code:
if($database->field_exists($table_name, $field_name) ) { ......

Dietmar
Logged

We are human beings - and nobody is perfect at all.
DarkViper
Development Team
*****
Offline Offline

Posts: 1254


« Reply #2 on: January 31, 2012, 06:39:42 PM »

Ok etwas ausführlicher, Dietmars Bemerkung war doch etwas kurz und knapp. wink

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

Code:
<?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. wink
« Last Edit: January 31, 2012, 11:33:40 PM by DarkViper » Logged

Anleitungen lesen und selber nachdenken ist anstrengend...  Da lass ich doch lieber andere für mich denken...

In 1984:  Nineteen Eighty-Four is a unrealistic utopia!!
In 2012:  Nineteen Eighty-Four is a little piece only of our reality!!
Stefek
WebsiteBaker Org e.V.

Offline Offline

Posts: 4884



« Reply #3 on: January 31, 2012, 08:00:54 PM »

Danke.
Gelegentlich ein Blick in das CANGELOG kann da oft hilfreich sein. wink
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  cool
Logged

"In a time of universal deceit, telling the truth becomes a revolutionary act."
- George Orwell, Nineteen eighty-four (1984)
Luisehahne
Board Member
Development Team
*****
Offline Offline

Posts: 3147



WWW
« 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
Logged

We are human beings - and nobody is perfect at all.
kweitzel
Forum administrator
*****
Offline Offline

Posts: 6977


WWW
« 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
Logged

WebsiteBaker Org e.V. - for WebsiteBaker

Stefek
WebsiteBaker Org e.V.

Offline Offline

Posts: 4884



« 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
Logged

"In a time of universal deceit, telling the truth becomes a revolutionary act."
- George Orwell, Nineteen eighty-four (1984)
BlackBird
AddOn Development
*
Offline Offline

Posts: 2069



WWW
« Reply #7 on: February 02, 2012, 04:59:03 PM »

FORKEN??? PFUI!!!
Logged

Alle großen Veränderungen beginnen im Kleinen
Stefek
WebsiteBaker Org e.V.

Offline Offline

Posts: 4884



« 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  tongue
Logged

"In a time of universal deceit, telling the truth becomes a revolutionary act."
- George Orwell, Nineteen eighty-four (1984)
easyuser

Offline Offline

Posts: 56


« 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]
Logged
kweitzel
Forum administrator
*****
Offline Offline

Posts: 6977


WWW
« 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 » Logged

WebsiteBaker Org e.V. - for WebsiteBaker

easyuser

Offline Offline

Posts: 56


« 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
Logged
DarkViper
Development Team
*****
Offline Offline

Posts: 1254


« 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.
Logged

Anleitungen lesen und selber nachdenken ist anstrengend...  Da lass ich doch lieber andere für mich denken...

In 1984:  Nineteen Eighty-Four is a unrealistic utopia!!
In 2012:  Nineteen Eighty-Four is a little piece only of our reality!!
kweitzel
Forum administrator
*****
Offline Offline

Posts: 6977


WWW
« 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 » Logged

WebsiteBaker Org e.V. - for WebsiteBaker

Stefek
WebsiteBaker Org e.V.

Offline Offline

Posts: 4884



« 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:
<?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 )&& !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 » Logged

"In a time of universal deceit, telling the truth becomes a revolutionary act."
- George Orwell, Nineteen eighty-four (1984)
Stefek
WebsiteBaker Org e.V.

Offline Offline

Posts: 4884



« Reply #15 on: February 03, 2012, 08:32:48 PM »

Zur Verdeutlichung,
die Idee ist einfach, zunächst ein Array zu erstellen

Code:
<?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:
<?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 » Logged

"In a time of universal deceit, telling the truth becomes a revolutionary act."
- George Orwell, Nineteen eighty-four (1984)
Pages: [1]   Go Up
Print
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.16 | SMF © 2011, Simple Machines Valid XHTML 1.0! Valid CSS!