Seite 1 von 1
MySql Eintrag mit Leerzeichen wird nicht eingefügt ?
Verfasst: 23.11.2007 03:10
von Natheedo
Halli Hallo,
ich versuche mich gerade ein bisschen an PHP + MySql.
Habe hier einen Befehl von einem Ranking Skript :
Wenn ich das ganze so lasse und das Skripte ausführe, wird der Eintrag Test auch in die Datenbank übernommen!
Wenn ich jedoch :
ausführen möchte, geht das nicht und das Skript hängt inner Endlosschleife, wahrscheinlich wegen den Leerzeichen.
Mir wäre es aber wichtig wenn ich das auch mit Leerzeichen irgendwie übernehmen kann. Geht das denn überhaupt ???
Vielen Dank !
Natheedo
Verfasst: 23.11.2007 04:25
von Kendoo
Hi,
also das was Du hier gepostet hast, ist ja ein Funktionsaufruf. Du müsstest auch mal die dazugehörige Funktion posten um da genaueres sagen zu können. Mit den Leerzeichen hat das aber normalerweise nichts zu tun, also zumindest wird so ein Text auch mit Leerzeichen in eine DB geschrieben aber wie gesagt, um da mehr sagen zu können poste mal die komplette Funktion.
Re: MySql Eintrag mit Leerzeichen wird nicht eingefügt ?
Verfasst: 23.11.2007 08:25
von djchrisnet
Natheedo hat geschrieben:Wenn ich jedoch :
schonmal mit
versucht?
Verfasst: 23.11.2007 09:55
von gn#36
Da der String vor dem Funktionsaufruf geparst wird dürfte das eigentlich keinen Unterschied machen.
Was da passiert hängt ganz von der Funktion ab, die wäre schon nötig um mehr sagen zu können (wenn sie länger ist: KB:datei).
Verfasst: 23.11.2007 13:47
von Natheedo
Hallo,
ist richtig, war schon spät, hätte gedacht ich hätte es mit verlinkt...
Die Funktion samt MySQL hier :
Code: Alles auswählen
function rating_bar($id,$units='',$static='') {
require('_config-rating.php'); // get the db connection info
//set some variables
$ip = $_SERVER['REMOTE_ADDR'];
if (!$units) {$units = 10;}
if (!$static) {$static = FALSE;}
// get votes, values, ips for the current rating bar
$query=mysql_query("SELECT total_votes, total_value, used_ips FROM $rating_dbname.$rating_tableName WHERE id='$id' ")or die(" Error: ".mysql_error());
// insert the id in the DB if it doesn't exist already
// see: http://www.masugadesign.com/the-lab/scripts/unobtrusive-ajax-star-rating-bar/#comment-121
if (mysql_num_rows($query) == 0) {
$sql = "INSERT INTO $rating_dbname.$rating_tableName (`id`,`total_votes`, `total_value`, `used_ips`) VALUES ('$id', '0', '0', '')";
$result = mysql_query($sql);
}
$numbers=mysql_fetch_assoc($query);
if ($numbers['total_votes'] < 1) {
$count = 0;
} else {
$count=$numbers['total_votes']; //how many votes total
}
$current_rating=$numbers['total_value']; //total number of rating added together and stored
$tense=($count==1) ? "vote" : "votes"; //plural form votes/vote
// determine whether the user has voted, so we know how to draw the ul/li
$voted=mysql_num_rows(mysql_query("SELECT used_ips FROM $rating_dbname.$rating_tableName WHERE used_ips LIKE '%".$ip."%' AND id='".$id."' "));
// now draw the rating bar
$rating_width = @number_format($current_rating/$count,2)*$rating_unitwidth;
$rating1 = @number_format($current_rating/$count,1);
$rating2 = @number_format($current_rating/$count,2);
Teil 2 :
Code: Alles auswählen
} else {
$rater ='';
$rater.='<div class="ratingblock">';
$rater.='<div id="unit_long'.$id.'">';
$rater.=' <ul id="unit_ul'.$id.'" class="unit-rating" style="width:'.$rating_unitwidth*$units.'px;">';
$rater.=' <li class="current-rating" style="width:'.$rating_width.'px;">Currently '.$rating2.'/'.$units.'</li>';
for ($ncount = 1; $ncount <= $units; $ncount++) { // loop from 1 to the number of units
if(!$voted) { // if the user hasn't yet voted, draw the voting stars
$rater.='<li><a href="../rating/db.php?j='.$ncount.'&q='.$id.'&t='.$ip.'&c='.$units.'" title="'.$ncount.' von '.$units.' Sternen" class="r'.$ncount.'-unit rater" rel="nofollow">'.$ncount.'</a></li>';
}
}
$ncount=0; // resets the count
$rater.=' </ul>';
$rater.=' <p';
if($voted){ $rater.=' class="voted"'; }
$rater.='>'.$id.' Bewertung: <strong> '.$rating1.'</strong>/'.$units.' ('.$count.' '.$tense.' cast)';
$rater.=' </p>';
$rater.='</div>';
$rater.='</div>';
return $rater;
}
}
?>
Vielleicht sieht ja jemand den Fehler!
Natheedo
Verfasst: 23.11.2007 17:38
von Natheedo
Ok ich hab jetzt auch das Problem weiter eingrenzen können, meine erste Vermutung das es unbedingt an der ID liegen muss, war wahrscheinlich falsch denn :
Das ist die gesamte Datenbank:
CREATE TABLE `ratings` (
`id` varchar(20) NOT NULL,
`total_votes` int(11) NOT NULL default 0,
`total_value` int(11) NOT NULL default 0,
`used_ips` longtext,
PRIMARY KEY (`id`)
) TYPE=MyISAM AUTO_INCREMENT=3;
Wenn ich die ID _ohne_ Leerzeichen nehme, wird der Eintrag auch korrekt geschrieben. Also es geht dann, IP, total votes usw. wird alles übernommen.
Sofern die ID aber Leerzeichen, - Zeichen oder _ Zeichen drin hat. Wird zwar der ID Eintrag in die Datenbank eingetragen, aber die anderen bleiben leer und das Skript hängt sozusagen in ner Endlosschelife, weil es vermutlich nix schreiben konnte.
Also wie ich das jetzt verstehe, liegt es ja gar nicht direkt an der ID - sondern viel eher das er durch das Leerzeichen die anderen Daten nicht in die Datenbank übernehmen kann .... ???
Wird immer komplizierter ...
Verfasst: 23.11.2007 18:39
von gn#36
Wenn du zusätzliche Informationen innerhalb von kurzer Zeit hast, dann füge sie bitte per Edit hinzu. Danke.
Du hast ein strukturelles Problem in deinem Aufbau würde ich sagen.
Du prüfst zunächst, ob ein Eintrag mit der gewünschten ID vorhanden ist (hierbei solltest du auf jeden Fall auf das Escaping achten da du einen String einbindest, sonst öffnest du der SqlInjection Tür und Tor). Wenn dem nicht so ist führst du einen Insert aus um sie einzufügen, d.h. in der Datenbank sollten dann Werte stehen. Allerdings holst du danach dann per mysql_fetch_assoc($query) nicht vorhandene Datensätze (wenn der Datensatz neu war), denn zu dem Zeitpunkt, als du das Query durchgeführt hast, waren die Daten ja noch gar nicht da wenn du sie neu einfügen musstest. Das kann natürlich trotzdem funktionieren wenn du da Nullen drin brauchst, ist aber nicht unbedingt der saubere Stil. Beim Insert gilt das gleiche: Du übernimmst einen String ungeprüft in die DB, führ da vorher besser mysql_real_escape_string() drauf aus.
Warum hast du nicht das vollständige Skript verlinkt?
Das Else im 2. Teil steht in keinerlei Zusammenhang zu irgend einem If im ersten - oder ich habe es mangels Einrückung und Trennung von if und Klammern in getrennten Zeilen übersehen.
Eine Endlosschleife sehe ich da jetzt auf Anhieb allerdings nicht drin - zumindest nicht in dem geposteten Teil.