Sākumlapa › Forumi › Mājas lapu izstrāde › Servera puse (php, java, ruby, perl, python) › Kāpēc pēc nl2br() paliek n zīmes?
Lietoju funkciju pie izvades, būtībā, ja tekstobksā saliek vairākās jaunās līnijas, parādās daudz \n \n simbolu. Lietoju tādu pašu scriptu standarta komentāriem, tur tādu problēmu nav. WTf?
$(”#komenturugrupa”).prepend(json.ry);
Chrome izvada
smibolus, bet FF turpina n.
var mainigais = json.ry;
$(“#komenturugrupa”).prepend(mainigais);
Kāpēc tā ir? Respektīvi response ir vienkārši teksts, tas nav funkcionējošs javascript kods, tādēļ arī ir šāda problēma!
P.s. Es pieņemu, ka response ir json, tad – der arī jebkurš cits veids, kā parastu teksta stringu var pārvērst json objektā.
$(”#komenturugrupa”).prepend(json.ry.replace(/n/g,”
“));
natolv:
json.ry norāda, ka tas ir objekts ar vērtību – string.
Edit:
Bet vispār problēmas cēlonis ir php kodā. Iespējams tieši mysql_escape_string raw bytes lietojot dubultā. Ieteiktu labāk mysql_real_escape_string, tieši multi-byte dēļ.
Jautājums Wuu: kāpēc mysql_escape_stringmysql_real_escape_string
$chat_message = str_replace( “n”, ‘
‘, htmlspecialchars(stripslashes($r[1])));
piwchix, nezinu atšķirību, bet izrādās lietoju mysql_real_escape_string
Problēmas pamatā ir tas, ka 2x tiek lietota mysql_real_escape_string, jo slashi tiek pievienoti šā kā tā. Var pa daļām likt lietā stringu, bet galvenais, lai vienam un tam pašam tekstam 2x neiet pāri šīs funkcijas, tāpēc arī rodas problēmas ar liekajiem slashiem. Un vēl no pārlūkiem atkarīgs, jo FF nesagaida vienkārši “n”, bet gan “r n”. Būtībā tam pašam būtu jāstrādā arī
$chat_message = nl2br(htmlspecialchars(stripslashes($r[1]));
Un labāk arī būtu izmantot šādi, jo pievienojot no FF new line komanda atkarībā no versijas var nebūt vienkārši “n”, bet gan “rn”, vai “nr”, un attiecīgi atkal komentārs būs ne tāds, kā vajag. Vai arī vienkārši izmantot preg_replace ar regulāro izteiksmi
/([^>rn]?)(rn|nr|r|n)/g
Ej lasi vikipēdiju, gudriniek.
In database management systems, a prepared statement or parameterized statement is a feature used to execute the same or similar database statements repeatedly
Vaicājuma konkatēšanai nav ne vainas, ja netiek apstrādāts batch. Labāk, protams, izmantot parametrizētu single instnce vaicājumu, bet SIQ nav prepared statements. 😀
$args = array(
‘d’=>’DDDD’,
‘f’=>’FFFF’
);
$query = $db->query(”SELECT `a` FROM `b` WHERE `c`=:d AND `e`=:f”,$args);
PDO prepared statements jeb sagatavotie vaicājumi darbojas tieši tā pat, bet SIQ ir cita nozīme – parasti SIQ ir paša rakstīta funkcionalitāte kas $args masīvā esošo info filtrē utt. Prepared statements savukārt ir paredzēts lai izpildītu vienu un to pašu kveriju, piem. 1000 reizes katru reizi nesūtot pašu kveriju uz serveri. Tā vietā serverim tiek nosūtīti tikai dati, jeb parametru vērtības. Domā par to, kā par mainīgajiem – tu aizsūti serverim kveriju ar noteiktiem atslēgvārdiem, vienu reizi. Pēc tam nosūti serverim datus un instrukciju, kādus mainīgos aizvietot ar kādām vērtībām. Noderīgi, ja nepieciešams ievietot lielu daudzumu ierakstu vai veikt apdeitus utml. jo katru reizi nav jāsūta pats vaicājums. 🙂
Es nedomāju, ka daudzi saprot atšķirību starp
$a=1;
$a = add1($a);
function add1($var){
$var = $var +1;
return $var;
}
un
$a=1;
add1($a);
function add1(&$var){
$var = $var +1;
}
Rezultāts jau ir viens un tas pats un absolūtam vairākumam tikai tas ir svarīgi. Tur neko neizdarīs, katrs programmēs kā pratīs, un nav arī viena un pareizā varianta, lai gan šajā variantā pareizāk būtu otrais variants.
Un te pat vēl funkcijas body var rakstīt:
$var = $var+1
$var +=1;
$var++;
piwchix
Varbūt vispirms iemācies programmēt un tad gudri vāvuļo. Tas, ko tu te sarakstīji ir bezkonteksta muļķības. Prepared statemenets ir TIKAI VIENS PIELIETOJUMS – BATCH PROCESSING! Punkts. Nav te par ko diskutēt. SIQ vaicājumi būs uz pusi efektīvāki ar stringu konkatenēšanu kā ar prepared statements. Tu to spētu saprast, ja jēgtu, par ko runā.
kur dati tiek padoti natīvā veidā atsevišķi no koda (SQL), nevis kaut kādā kopējā stringu caurmuļļāšanā
Pērle. Pērle no pērlēm. Jo prepared steitmenta un datu atsevišķa sūtīšana uz serveri jau resursus protams netērē. Kur nu. Tā vietā, lai serverim nosūtītu konkatenētu stringu ar SQL natīvu komandu, tiek nosūtīts strings bez vērtībām, pēc tam tas izpārsēts, piešķirtas vērtības un pēc tam izpildīts. Ä¢eniāli. Sēdies, puisīt. Būtu mans students, ieliktu 2. 🙂
PDO(ko minēja Inspektors_Caps) ir pilnīgi tas pats, kas ar roku rakstīts sql, tikai objektorientēts. Respektīvi PDO ir cilvēkam saprotamākā valodā uztaisītas metodes(nu tādas kā mysql_query, mysql_real_escape_string u.c.) lai varētu operēt ar datubāzes vaicājumu(query) – kā objektu.
Tas ir tikai un vienīgi tāpēc, lai atvieglotu programmēšanu UN ar PDO var izdarīt visu to pašu, ko ar natīvo metodi mysql_query!
Īsumā – PDO ir tikai tāpēc, lai nebūtu lielas galvassāpes pašiem programmētājiem sarakstot nezin cik garu vaicājumu pēc gada skatoties to un domājot – WTF!
atsauce –
Un root – ar PDO var insertot datu grupas(multiple insert) atšķirībā ar musql_query(), piem kā:
$query = “INSERT INTO table (number,name) VALUES (1,’test1′),(2,’test2′),(3,’test3′)”;
mysql_query($query);
Alternatīva ar PDO:
$query = “INSERT INTO table (number,name) VALUES (1,’test1′),(2,’test2′),(3,’test3′)”;
$db->exec($query);
P.s. Nekur nav minēts, ka obligāti ir jābindo mainīgie izmantot PDO!
Preses relīzes