Kāpēc pēc nl2br() paliek n zīmes?

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?

Tiek skatīts 1 ieraksts (no 50 kopumā)
  • Autors
    Ieraksti
  • #157009
    Wuu
    Participant

    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?

    [img]https://notepad.lv/userpix/1213_untitled1_1.png[/img]

    #289266
    piwchix
    Participant

    Pirmā doma “addslashes” . Pamēģini pirms nl2br “stripslashes” funkciju.

    #289267
    Aldis
    Participant

    Es lietoju str_replace šim nolūkam, un strādā perfekti. 🙂

    #289268
    Wuu
    Participant

    Tas nestrādās manā variantā, jo lietoju divus mysql_escape_string() pēc kārtās. Izvācu lieku un viss bumbās PHP. Bet palika problēma ar Javascriptu.

    Code:

    $(”#komenturugrupa”).prepend(json.ry);

    Chrome izvada
    smibolus, bet FF turpina n.

    #289269
    natolv
    Participant

    Ieliec saturu mainīgajā un tad to prependo. Piem.

    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ā.

    #289270
    piwchix
    Participant

    Code:

    $(”#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_string nevis mysql_real_escape_string?

    #289271
    Inspektors_Caps
    Participant

    Visiem izstrādātājiem, kuri SQL pieprasījumos datus iekļauj savienojot stringus, būtu jānocērt viņu līkie pirksti!

    https://php.net/manual/en/pdo.prepared-statements.php

    #289272
    Wuu
    Participant

    Izlīdzējos ar šādu funkciju, strādā tikai ar MySql datiem.

    Code:

    $chat_message = str_replace( “n”, ‘
    ‘, htmlspecialchars(stripslashes($r[1])));

    piwchix, nezinu atšķirību, bet izrādās lietoju mysql_real_escape_string

    #289273
    piwchix
    Participant

    PPS ir laba lieta, tomēr, ne vienmēr labs risinājums. Ko līdz nonāksim multi-level sub-querying, nonākam izejas punktā. Performances/lietojamības ziņā prepared-statements ļoti labi, bet ja runa iet par scalability…

    #289274
    Inspektors_Caps
    Participant

    Tas ir drošības, performances, lietojamības, vienkāršības un arī scalability.. jeb pilnīgi visās ziņās labāks risinājums. Tak veido savu pieprasījumu dinamiski un kā gribi, bet DATUS neliec iekšā. Dinamiski pievienojot jaunu sub-query vai jebko citu, arī tajos datu vietā liekam tikai jautājuma zīmes un tik pat dinamiski bindojam klāt jaunus mainīgos.

    #289275
    piwchix
    Participant

    Ok, nestrīdos, pa šiem gadiem daudz kas var būt mainījies, kādreiz bija milzums problēmu ar prepared-statements.

    #289276
    piwchix
    Participant

    Nevar tā vienkārši izstāstīt atšķirību – raw bytes VS multi-byte characters un mysql_real funkcijai ir nepieciešama DB konekcija, lai pēc konkrētās konfigurācijas eskeipotu nevēlamos čarakterus, mysql_escape_string ir statiska.

    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ī

    Code:

    $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

    Code:

    /([^>rn]?)(rn|nr|r|n)/g

    #289277
    root
    Participant

    Rekomendē lietot abstrakcijas slāni datubāzēm un demagoģē par veiktspēju, skeilojamību un vienkāršību. Stulbenis. 😀

    Ej lasi vikipēdiju, gudriniek. https://en.wikipedia.org/wiki/Prepared_statement

    Quote:

    In database management systems, a prepared statement or parameterized statement is a feature used to execute the same or similar database statements repeatedly with high efficiency.

    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. 😀

    #289278
    Wuu
    Participant

    Tu Spāniski raksti? Nesaprotu neko 😀

    #289279
    root
    Participant

    Tulkojums – SIQ jeb single-instance query ir improvizēts vai DB draivera atbalstīts veids, kā parametrizēt DB vaicājumu, piemēram,

    Code:


    $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. 🙂

    #289280
    piwchix
    Participant

    Un tāpēc es saku nav viena un pareizā veida/sistēmas kā programmēt. Tikpat milzums programmētāju nezin/neizprot elementāras mainīgo/objektu references, to priekšrocības dažādās situācijās performance/scalability ziņā.

    Es nedomāju, ka daudzi saprot atšķirību starp

    Code:


    $a=1;
    $a = add1($a);
    function add1($var){
    $var = $var +1;
    return $var;
    }

    un

    Code:


    $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:

    Code:


    $var = $var+1
    $var +=1;
    $var++;

    #289281
    Inspektors_Caps
    Participant

    Pa šiem gadiem nekas nav mainījies – gan prepared statement DB sistēmām un programmēšanas komponentēm vienmēr ir bijuši, gan programmēšanas valodām IFi un cikli – neko vairāk arī nevajag. Tāpat nav mainījies arī tas, ka aprobežotiem prātiem tas nepielec!

    piwchix iemācījies izmantot references un nu domā, ka ir līmenī. 😀 Tas ir pamatu pamats, un tie, kuri to nesaprot, vispār nav programmētāji! Mainīgā palielināšanas veidus vispār piemini absolūti nevietā, jo tas ir tikai stila jautājums, bet prepared statement ir nopietna fundamentāli pareiza lieta, kur dati tiek padoti natīvā veidā atsevišķi no koda (SQL), nevis kaut kādā kopējā stringu caurmuļļāšanā, kas vēl ierobežo arī lietojamību, pie tam katram ierakstam muļļājot (kompilējot) kveriju no jauna.

    #289282
    piwchix
    Participant

    Ak dievs, iemācies izprast kontekstu, nevis tikai tekstu.

    #289283
    root
    Participant

    >>Inspektors_Caps

    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ā.

    Quote:

    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. 🙂

    #289284
    natolv
    Participant

    Ehhh… viens gudrāks par otru 😀

    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 – https://www.php.net/manual/en/intro.pdo.php

    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!

Tiek skatīts 1 ieraksts (no 50 kopumā)
  • Jums ir jāpieslēdzas sistēmai, lai varētu komentēt šo tēmu.
Jaunākais portālā