MySQL

Doppelte bzw. mehrfache Einträge finden bzw. auflisten

caticonslite_bm_alt

Um doppelte oder gar mehrfach vorkommende Einträge in MySQL zu finden und aufzulisten, kann das folgende MySQL-Statement verwendet werden:

SELECT email, COUNT(1) AS COUNT FROM newsletterRecipients WHERE deleted = 0 GROUP BY email HAVING COUNT(1) > 1;

In diesem Fall erhält man E-Mail-Adressen und die Anzahl der Vorkommnisse.

mysqldump auf (sehr) großen Installationen

caticonslite_bm_alt

mysqldump wird standardmäßig mit der Option „–opt“ ausgeführt (siehe MySQL: mysqldump). Dies ist eine Kurzform für die Optionen „–add-drop-table –add-locks –create-options –disable-keys –extended-insert –lock-tables –quick –set-charset“. D.h. während des Dumps werden Tabellen gesperrt, um die Konsistenz der Daten zu garantieren. Auf (sehr) großen Installation führt dies allerdings zu einer vorübergehenden Nichterreichbarkeit des Systems. Im schlimmsten Fall kann sogar eine Überlastung des/der Server(s) die Folge davon sein: Nämlich dann, wenn während des Dumps – aufgrund der gesperrten Tabellen – sehr viele Webserver-Prozesse auf wartend gesetzt und danach abgearbeitet werden sollen.

Um diesem Problem zu entgehen, muss mysqldump mit der Option „–skip-lock-tables“ gestartet werden – z.B.:

mysqldump --skip-lock-tables -hHostname -uUsername -pPassword Database > Database.sql

Vermeiden ließe sich das Problem natürlich auch mit einer Master-Slave-Konfiguration.

RSS-Feed generieren

caticonslite_bm_alt

Viele TYPO3-Erweiterungen zur Generierung von RSS-Feeds können lediglich Seiten und tt_news-Artikel verwenden – das ist häufig nicht ausreichend. Eine Ausnahme bildet die Extension „in2rss“, welche sich recht flexibel mittels TypoScript konfigurieren lässt und Datensätze aus jeder beliebigen Tabelle darstellen kann.

Nach der üblichen Vorgehensweise zur Installation des Plugins, müssen noch die zu verwendendenTabellen konfiguriert werden. Die Grundkonfiguration samt einem vorkonfigurierten Beispiel lässt sich mittels Static Template einfügen – dieses erscheint mir allerdings als unpraktikabel, daher lege ich alle notwendigen Parameter selbst im Setup fest:

includeLibs.in2rss_main = EXT:in2rss/lib/class.tx_in2rss_main.php
 
rss = PAGE
rss {
	typeNum = 100
 
	config {
		disableAllHeaderCode = 1
		disablePrefixComment = 1
		xhtml_cleaning = 0
		admPanel = 0
		no_cache = 1
	}
 
	10 = USER
	10 {
		userFunc = user_in2rss_main->showRSS
		userFunc.config {
			template = fileadmin/templates/webentwickler/in2rss/template.xml
			sorting = DESC
			limit = 20
			uft8_coding =
 
			10 {
				settings {
					table = pages
					fieldTitle = title
					fieldDescription = description
					fieldBody = description
					fieldImage = media
					fieldSorting = crdate
					fieldCrdate = crdate
					pid =
					pid_recursive = 0
					additionalWhereClause = AND doktype IN (1) AND nav_hide = 0
					cropDescription = 250
					limit = 100
				}
 
				fields {
					rssTitle = TEXT
					rssTitle {
						field = rssTitle
					}
 
					rssDescription = TEXT
					rssDescription {
						field = rssDescription
					}
 
					rssBody = TEXT
					rssBody {
						field = rssBody
					}
 
					rssSorting = TEXT
					rssSorting {
						field = rssSorting
					}
 
					rssCrdate = TEXT
					rssCrdate {
						field = rssCrdate
					}
 
					rssLink = TEXT
					rssLink {
						typolink {
							parameter.field = uid
							returnLast = url
						}
					}
				}
			}
		}
	}
}
 
[globalVar = GP:type = 100]
	config.absRefPrefix = {$baseUrl}
[end]

Die Konfiguration der Tabelle erfolgt in den Zeilen 24-74, in diesem Fall werden alle nicht im Menü versteckten (nav_hide = 0) Seiten (table = pages) vom Typ Standard (doktype IN (1)) verwendet. Die restlichen Zeilen dieses Bereichs enthalten Parameterzuweisungen, damit diese im in Zeile 19 angegebenen Template verwendet werden können:

<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
	<channel>
		<title>webentwickler.at</title>
		<link>http://www.webentwickler.at/</link>
		<description>Blog für Webentwickler.</description>
		<language>de</language>
 
		<f:for each="{rssFeed}" as="rss"><f:if condition="{rss.rssTitle}">
			<item>
				<title>{rss.rssTitle}</title>
				<description>{rss.rssDescription}</description>
				<link>{rss.rssLink}</link>
				<pubDate>{rss.rssCrdate}</pubDate>
			</item>
		</f:if></f:for>
	</channel>
</rss>
 nach oben