[gelöst] Tabelle importiert (Latin1), gibt es da bessere Möglichkeiten?
am 26.11.2009 - 08:42 Uhr in
Hallo zusammen,
ich habe an dieser Stelle eine Frage, zum Import von einer Tabelle die auch noch im charset ISO-8859-1 vorliegt. Gibt es eine Möglichkeit diese Tabelle mit diesem charset sauber zu importieren, oder wäre meine Lösung auch einigermassen in Ordnung??
Das meiste habe ich auch richtig hinbekommen. So kann ich z.B. die Rechte setzen, was auch gut funktioniert. Da es sich nur um eine Ausgabe einer Tabelle handelt (mit Wahlmöglichkeit einzelner Einträge), brauche ich nur den Zugriff für das "View"-Recht.
Wie ich das nun nachgelesen habe, auch hier im Forum keine passenden Antworten fand, dachte ich dass ich vielleicht eine Erklärung bekommen könnte.
Gibt es hier einfachere, bzw. sichere/bessere Lösungen, als den Code den ich hier erstellt habe? Wegen dem Charset kann ich die Tabelle nicht einfach importieren, es geht in der zweiten Tabelle dann um fast 1MB nur Text...
Vielen Dank für die Hilfe
fh
(Es handelt sich hier um ein kleines CSS-Manual mit 73 Einträgen, das PHP-Manual besteht aus fast 400 Einträgen mit jeweils etwa 1500 Zeichen...)
Meine cssmanual.install Datei, um das Schema bekannt zu machen und zur Deinstallation:
<?php
/**
* Implementation of hook_install()
*/
function cssmanual_install() {
drupal_install_schema('cssmanual');
}
/**
* Implementation of hook_uninstall()
*/
function cssmanual_uninstall() {
drupal_uninstall_schema('cssmanual');
}
/**
* implementation of hook_schema()
*/
function cssmanual_schema() {
$schema['cssman'] = array(
'description' => t('TODO: please describe this table!'),
'fields' => array(
'id' => array(
'description' => t('TODO: please describe this field!'),
'type' => 'serial',
'unsigned' => TRUE,
'not null' => TRUE,
),
'titel' => array(
'description' => t('TODO: please describe this field!'),
'type' => 'varchar',
'length' => '200',
'not null' => TRUE,
'default' => '',
),
'beschreibung' => array(
'description' => t('TODO: please describe this field!'),
'type' => 'text',
'not null' => TRUE,
),
'beschreibung2' => array(
'description' => t('TODO: please describe this field!'),
'type' => 'text',
'not null' => FALSE,
),
'spez1' => array(
'description' => t('TODO: please describe this field!'),
'type' => 'text',
'not null' => FALSE,
),
'autor' => array(
'description' => t('TODO: please describe this field!'),
'type' => 'varchar',
'length' => '50',
'not null' => TRUE,
'default' => '',
),
'datum' => array(
'description' => t('TODO: please describe this field!'),
'type' => 'varchar',
'length' => '10',
'not null' => TRUE,
'default' => '00.00.0000',
),
),
'primary key' => array('id'),
);
return $schema;
}
?>
Und hier die Moduldatei cssmanual.module:
<?php
// $Id$
/**
* @file
* Wir brauchen einen Menüpunkt für unsere Datenbankausgabe des CSS-Mauals
*/
/**
* Implementation of hook_perm()
*/
function cssmanual_perm() {
return array('view cssmanual');
}
/**
* Implementation of hook_access()
*/
function cssmanual_access($op) {
return user_access('view cssmanual');
}
/**
* Implementation of hook_init()
*/
function cssmanual_init() {
drupal_add_css(drupal_get_path('module', 'cssmanual') . '/css/cssmanual.css');
}
/**
* Implementation of hook_menu()
*/
function cssmanual_menu() {
$items['cssmanual'] = array(
'title' => 'Ubersicht aller CSS Formatanweisungen!',
'page callback' => 'cssmanual_dist',
'access callback' => 'user_access',
'access arguments' => array('view cssmanual'),
'type' => MENU_NORMAL_ITEM,
);
$items['article'] = array(
'title' => 'Aktueller Eintrag!',
'page callback' => 'cssmanual_art',
'access callback' => 'user_access',
'access arguments' => array('view cssmanual'),
'type' => MENU_CALLBACK,
);
return $items;
}
/**
* callback function cssmanual_distribute()
*/
function cssmanual_dist() {
$sql = "SELECT * from {cssman} s ORDER BY s.titel ASC";
$count = db_result(db_query("SELECT COUNT(id) from {cssman}"));
$mylist = "<h3>Vorhandene Einträge: $count</h3><br />";
$result = db_query($sql);
while ($data = db_fetch_object($result)) {
$titel = $data->titel;
$id = $data->id;
$mylist .= '<h4><a class="cssmanual" href="' . $base_path . 'article/?id=' . $id . '" title="Link zum Eintrag">' . $titel . '</a>';
};
return $mylist;
}
/**
* callback function cssmanual_article()
*/
function cssmanual_art() {
$id = intval(trim(htmlentities($_GET['id'])));
if (count($id) < 6) {
$lang = strlen($id);
if ($lang == 1) {
$id = "00000$id";
} else if ($lang == 2) {
$id = "0000$id";
} else if ($lang == 3) {
$id = "000$id";
} else {
echo "</body></html>";
exit("Abbruch des Skriptes, es wurde ein Fehler erzeugt.");
}
} else {
// muss nicht ausgeführt werden $id ist schon $id.
}
$result = db_query("SELECT * from {cssman} WHERE id = %d", $id);
$data = db_fetch_object($result);
$mylist = "<h3 id='arttitel'>$data->titel</h3>";
$mylist .= "<p id='beschreibung'>$data->beschreibung</p>";
$mylist .= "<pre id='cssdaten'>$data->beschreibung2</pre>";
$mylist .= "<p>$data->spez1</p>";
$mylist .= '<a id="retour" href="javascript:history.back()">Zur Liste</a>';
return $mylist;
}
- Anmelden oder Registrieren um Kommentare zu schreiben
latin1 -> utf8
am 26.11.2009 - 10:01 Uhr
Du kannst die Daten mittels
iconv
nach UTF-8 konvertieren und dann importieren.iconv -f iso-8859-1 -t utf8 dump_iso88591.sql > dump_utf8.sql
Alternativ kannst Du auch die in diesem Artikel beschriebene Lösung verwenden.
Mal noch ein paar kleine Hinweise zum Code:
<?php
function cssmanual_schema() {
$schema['cssman'] = array(
'titel' => array(
// ...
),
'beschreibung' => array(
// ...
),
),
}
?>
Standardsprache in Drupal ist Englisch (oben zitierter Code ist nur ein Beispiel; das bezieht sich auf sämtliche Texte Deines Moduls). Ich weiss, Du hast das Modul nur für Deine Zwecke entwickelt, jedoch macht es Sinn, von vornherein die Standards und auch die Coding standards zu befolgen. So muss man sich später nicht extra umgewöhnen, falls man doch mal etwas für Andere schreibt.
<?php
function cssmanual_access($op) {
return user_access('view cssmanual');
}
?>
hook_access implementierst Du nur, wenn Du den Zugriff auf einen im Modul definierten Inhaltstypen regeln möchtest.
Da Du keinen Inhaltstypen definierst, kannst Du diese Funktion auch getrost weglassen.
<?php
function cssmanual_init() {
drupal_add_css(drupal_get_path('module', 'cssmanual') . '/css/cssmanual.css');
}
?>
Das würde ich nicht im
hook_init
hinzufügen, sondern ein der Funktion die die entsprechende Seite erstellt (alsocssman_dist
undcssman_art
). Ansonsten wird die CSS auf jeder Seite Deiner Installation geladen (auch wenn sie eigentlich gar nicht benötigt wird).<?php
/**
* callback function cssmanual_distribute()
*/
function cssmanual_dist() {
// ...
$mylist = "<h3>Vorhandene Einträge: $count</h3><br />";
// ...
}
?>
HTML-Quelltext direkt in einem Modul ist nicht wirklich schön. Schau Dir mal Creating Drupal 6.x modules und dort insbesondere Using the theme layer an.
Dort ist erklärt, wie Du theme-Funktionen definierst und verwendest. Das erleichtert Dir (nicht sofort, jedoch später mal) Deine Arbeit. Speziell, wenn Du irgendwann man ein anderes Theme verwendest und die Ergebnisse dort anders darstellen möchtest.
<?php
function cssmanual_art() {
$id = intval(trim(htmlentities($_GET['id'])));
?>
Verwende besser filter_xss_admin und is_numeric.
hth,
Stefan
--
Sei nett zu Deinem Themer!
Danke für die Antwort
am 26.11.2009 - 10:40 Uhr
Hallo Stefan,
Danke vielmals für die Lösung. Das meiste leuchtet mir ein was du sagst, aber das mit den Rechten kann ich nicht nachvollziehen.
Auch wenn ich hier keinen Inhaltstypen habe, kann ich trotzdem das Recht "view ..." vergeben, d.h. wenn ich es z.B. dem nicht angemeldeten Nutzer entziehe, so wird auch nichts ausgegeben. Wahrscheinlich habe ich das falsch verstanden und jetzt wird einfach die ganze Ausgabe (also das Modul) unterdrückt?!? In der Rechtetabelle geht das jedenfalls klaglos.
Das mit der CSS-Datei Einbindung verschiebe ich in die callback-Funktionen, da hast du völlig recht.
Das mit dem HTML ist wirklich nicht optimal, deshalb auch meine Nachfrage hier. Ich hätte gerne alles Drupal konform gemacht, da muss ich mal deine Links durchlesen...
So wie ich das jetzt verstanden habe gibt es zwei Möglichkeiten.
1. Entweder ich gebe die Daten wie gehabt aus und verbessere noch was ich verbessern kann.
2. Oder ich mache einen Import und wandle die Tabellen um. Da stellt sich mir die Frage, ob ich dann nicht Probleme mit den
und Ausgaben bekomme, da sind auch Einrückungen und im PHP-Manual viele Codebeispiele drin.
Du hast mir jedenfalls sehr viel weiter geholfen. Vor allem für die Zeit die du für die Antwort brauchtest, bedanke ich mich nochmal :-)
Gruss
Fredi
P.S. bei den Komentaren und der Variablenbenennung in englisch muss ich mehr acht geben. Dann halt in english und mit der t()-Funktion...wo es um Ausgaben geht.
Erklärung
am 26.11.2009 - 10:50 Uhr
Auch wenn ich hier keinen Inhaltstypen habe, kann ich trotzdem das Recht "view ..." vergeben,
Ja. Das machst Du jedoch über
hook_perm
, nicht überhook_access
.2. Oder ich mache einen Import und wandle die Tabellen um. Da stellt sich mir die Frage, ob ich dann nicht Probleme mit den
und Ausgaben bekomme, da sind auch Einrückungen und im PHP-Manual viele Codebeispiele drin.
Musst Du einfach mal probieren. Eigentlich sollte es dabei keine Probleme geben.
Stefan
--
Sei nett zu Deinem Themer!
Hallo
am 26.11.2009 - 12:06 Uhr
Hallo Stefan,
Dankeschön,
wieder was gelernt
Gruss
Fredi
EDIT/Info: das mit dem hook_theme() muss ich noch nachlesen, habe ja das Entwicklerhandbuch extra mal angeschafft. Hoffe dass ich das richtig verstanden habe:
ein hook_theme() angeben und dann die richtige *.tpl.php Datei bearbeiten. Alle anderen Sachen die du sagtest, konnte ich auch schon anpassen (hook_access wegnehmen usw.)
Also muss ich "nur" auf die richtige Bereitstellung aller Daten achten. Das Theming selber ist dann wieder leichter für mich.
Den Rest habe ich jetzt geändert, die Texte sind alle in t()-Funktionen und über "Oberfläche übersetzen" dann in Deutsch angepasst. Kommentare auch in englisch und das HTML sollte ich dann in der tpl.php einpflegen können ...
meine Lösung
am 27.11.2009 - 19:55 Uhr
Hallo,
ich wollte hier noch den jetzigen Code veröffentlichen. Für falsche englische Sätze übernehme ich keine Verantwortung - leider. :-)
Das mit den Templates konnte ich schliesslich (nach langer Suche) doch noch zufriedenstellend lösen. Da ich keine Nodes zur Verfügung hatte, bot Drupal mir zwei page-example.tpl.php Dateien an, also für jeden Callback eine.
Das Problem war ja, dass ich ohne Import Der Beiträge die Datensätze nicht als Node behandeln konnte. Also fehlte mir auch jede Möglichkeit für ein
theme(...)
und auch denhook_theme()
brachte ich nicht zum laufen.Die Anmeldung des Moduls, hat mir dann wenigstens die Ausgabe über genannte page... Template Dateien ermöglicht.
Ein etwas "komisches" Modul, aber ich brauchte hier auch nicht mehr Anforderungen, weil die Tabelle nur für die Ausgabe gedacht ist und war.
Die Tipps haben mir immens geholfen und ich konnte einiges beherzigen. Mein nächstes Modul wird dann auch Operationen und "theme()" beinhalten... (Gästebuch?!).
Gruss
<?php
// $Id$
/**
* @file
* We need a menupoint for the CSS-manual list
*/
/**
* Implementation of hook_node_info()
*/
function cssmanual_node_info() {
return array(
cssmanual => array(
'name' => t('CSS-manual'),
'module' => 'cssmanual',
'description' => t('this Node-type can not have new Articles.'),
'has_title' => FALSE,
'has_body' => FALSE,
'locked' => TRUE,
)
);
}
/**
* Implementation of hook_perm()
*/
function cssmanual_perm() {
return array('view cssmanual');
}
/**
* Implementation of hook_menu()
*/
function cssmanual_menu() {
$items['cssmanual'] = array(
'title' => t('All CSS entries!'),
'page callback' => 'cssmanual_dist',
'access callback' => 'user_access',
'access arguments' => array('view cssmanual'),
'type' => MENU_NORMAL_ITEM,
);
$items['article'] = array(
'title' => t('Current entry!'),
'page callback' => 'cssmanual_art',
'access callback' => 'user_access',
'access arguments' => array('view cssmanual'),
'type' => MENU_CALLBACK,
);
return $items;
}
/**
* callback function cssmanual_distribute()
*/
function cssmanual_dist() {
drupal_add_css(drupal_get_path('module', 'cssmanual') . '/css/cssmanual.css');
$sql = "SELECT * from {cssman} s ORDER BY s.titel ASC";
$count = db_result(db_query("SELECT COUNT(id) from {cssman}"));
$output['allart'] = t("All articles") . ' ' . $count;
$result = db_query($sql);
$a = 1;
while ($data = db_fetch_object($result)) {
$output['titel'][$a] = $data->titel;
$output['myid'][$a] = $data->id;
$output['basepath'][$a] = $base_path;
$a++;
};
return $output;
}
/**
* callback function cssmanual_article()
*/
function cssmanual_art() {
drupal_add_css(drupal_get_path('module', 'cssmanual') . '/css/cssmanual.css');
$id = $_GET['id'];
if (filter_xss($id) && is_numeric($id)) {
// validation is ok.
} else if (!filter_xss($id) || !is_numeric($id)) {
// validation is not ok.
return t('Error in GET');
}
$result = db_query("SELECT * from {cssman} WHERE id = %d", $id);
$data = db_fetch_object($result);
$output['myid'] = $data->titel;
$output['descr'] = $data->beschreibung;
$output['descr2'] = $data->beschreibung2;
$output['spez1'] = $data->spez1;
return $output;
}