• Off-topic
  • Programmare in PHP nel 2021 ha senso o no?

Braccoz il tuo parere è gradito, non eittarti.

[cancellato] Cultura alimentata da chi con i database non ci ha mai lavorato in vita sua, e non ha mai capito come lavora il query planner. Riusare una stessa query con valori parametrici diversi significa ripescare direttamente dalla cache la migliore strategia di accesso al dato senza rifare l'analisi.
Involuzione informatica.

Ma scusa l'uso di query fatte attraverso comandi domain-specific languages (per esempio le LINQ di C#, o più in generare le funzioni lambda) per effettuare le query non è simile a quello delle query parametriche?
In quando mi sembra che la query PDO prima di essere inviata al DB viene compilata e trasformata in SQL.

Inoltre il query planner non dovrebbe essere sensibile ai parametri, e il risultato sarebbe simile a quello delle query "classiche" in quanto tutte le query arrivano al DB come stringa. Soprattutto per il fatto che non c'è una sintassi comune tra i vari linguaggi ma ognuno fa a sé (alcuni ? altri @nome, ...)

Infine inoltre le Prepared statement non proteggono da attacchi XSS né da attacchi SQL di seconda specie a Trigger o simili, quindi l'input deve essere sempre filtrato a priori.

Però forse ho capito: intendi che basta che sia un parametro che cambia ed il query planner non fa l'analisi?

[cancellato] Sì, mi stanno abbondantemente sui $gioielli Hibernate e simili, e soprattutto le loro mer(d)avigliose query autogenerate illeggibili ed inutilmente prolisse perché per pigrizia recuperano tutti i campi degli "oggetti" che non servono, o fanno 3000 query per il lazy loading, quando basterebbe sapere cosa si vuole ottenere fin dal principio (ma implica essere capaci a programmare e a fare analisi, cosa non scontata).

Sul fatto che ci siano strumenti come l'Hibernate che sono un ufficio complicazioni delle query sono d'accordo, ma non tutti gli strumenti di generazione query via funzioni/dsl sono così

    only4midi
    e chi è il furbone che ha commissionato i lavori in php ad uno sviluppatore che lavorava su .net ?😅
    Proprio vero che certe aziende proprio non curano proprio come spendono.
    Non ce l'ho con te eh.. ci mancherebbe ! Anzi.. sono contento per voi.😉
    Però vedo spesso tanto pressapochismo in certi ruoli aziendali che fa paura.. ma prendete dei consulenti no ?

    simonebortolin In quando mi sembra che la query PDO prima di essere inviata al DB viene compilata e trasformata in SQL.

    In PHP lo decidi tu, sono previste entrambe le modalità. Da quello che ho capito, si preferisce farle compilare al DB perché è più sicuro

      handymenny Io avevo letto che in PDO c'era un ambiente virtuale di test delle query che fa da compilazione e sanificazione, però se è così meglio. Magari andrò a leggere bene tutto il funzionamento di PDO, più che altro non sapevo che un DMBS aveva API del genere.

        • [cancellato]

        simonebortolin In quando mi sembra che la query PDO prima di essere inviata al DB viene compilata e trasformata in SQL.

        Il problema è proprio quello. Una query parametrica per di più "prepared" non deve essere riparsata, l'engine DB l'ha già bella e pronta per l'esecuzione - sono comunque più sono molto più robuste alla SQL Injection - defense in depth, comincia a metterci una barriera in più invece di sperare che la libreria di sanitizzazione degli input scaricata da qualche repository e scritta da un Elboniano nel tempo perso non abbia bug.

        Cambiare ogni volta la query non sfrutta questa capacità. Per query "una tantum" cambia poco e può a volte anche essere più efficiente - di solito in ambiente datawarehouse dove il plan è più sensibile ai parametri - ma più spesso in ambiente OLTP è dannoso - e non è che un DB moderno ignora il valore dei parametri - di solito ormai fra le statistiche ha anche la distribuzione dei dati e vede se un parametro è "borderline".

        Il problema è che ci sono due modi per usare un database - il primo è il "data dump" - la "discarica dei dati" dove lo usi in pratica solo come storage, il secondo è usarlo come un rdbMS - con l'accento su Management System - dove sftutti le capacità del sistema di elaborare in proprio - e di solito in maniera molto efficiente purché usati come richiesto - molto meno portabile, ma spesso molto più efficiente - in particolare se usi database che hanno capacità elevate di elaborazione.

        Parlo di database relazionali perché se parliamo di SQL escludo altri tipi.

          • [cancellato]

          Technetium Si è stra superato a livello enterprise poi certo se fai siti in drupal per i negozietti di quartiere è ancora la scelta migliore forse, come detto è una tecnologia superata ad oggi, ma va ancora bene per alcuni usi.

            • [cancellato]

            simonebortolin Sul fatto che ci siano strumenti come l'Hibernate che sono un ufficio complicazioni delle query sono d'accordo, ma non tutti gli strumenti di generazione query via funzioni/dsl sono così

            Questo lo dice chi non sa programmare ad oggetti e non conosce il paradigma di Hibernate, ovvio che se non lo conosci e pensi ancora a query è ovvio che ti risulti complicato.
            Poi come sempre tutte le tecnologie hanno i pro e i contro come per tutto.

              • [cancellato]

              • Modificato

              simonebortolin Inoltre il query planner non dovrebbe essere sensibile ai parametri,

              Non lo è infatti, ma al testo scritto sì.
              E se il linguaggio traduce SELECT * FROM prezzi WHERE item = "mela"; e SELECT * FROM prezzi WHERE item = "pera"; in due stringhe diverse invece che (SELECT * FROM prezzi WHERE item = ?;, "mela") e (SELECT * FROM prezzi WHERE item = ?;, "pera") , per il query planner sono due query diverse, e deve ricominciare l'analisi. Magari si ferma ad estrarre i literali e a renderla internamente pseudo-parametrica, ma è sempre lavoro in più che deve fare quando può comparare un hash di una stringa e accorgersi che, toh, ce l'ho già.

              simonebortolin l'input deve essere sempre filtrato a priori.

              Non ho mai detto che non si debba fare o che servano a questo però 😉

              [cancellato] Conosco flotte di DBA (sic!) strenui sostenitori de "la coerenza relazionale deve essere garantita dall'applicazione" e che non mettono foreign key perché gli ostacolano i backup/restore (non hanno capito che basta sospenderle o eliminarle e ricrearle, in caso estremo...) e il loro modo di creare gli oggetti (per certa gente per dire è """normale""" che esistano prima le righe fattura della testata)... poi si chiedono perché sono sempre nervoso...

                simonebortolin Io avevo letto che in PDO c'era un ambiente virtuale di test delle query che fa da compilazione e sanificazione, però se è così meglio.

                si tratta del flag: PDO::ATTR_EMULATE_PREPARES

                Apprendo dal web, che mentre per MySQL l'emulazione è attiva di default per motivi di compatibilità con vecchie versioni di MySQL, con DBMS più "avanzati" come Postgresql è disattiva di default

                  [cancellato] però in ambito datawarehouse non ci dovrebbe essere bisogno di filtrare le query o sbaglio? Non ci dovrebbe essere input dell'utente malefico, e quindi in quel caso query preparate hanno senso, inoltre non credo neanche che si usi PHP in ambito DW.

                  [cancellato] Premetto che di Hibernate ho solo visto codice scritto da altri per vari motivi non ho mai approfondito più di tanto, ma essendo un ORM come tanti altri più o meno complessi (da Android Room, Realm (però questo usa un paradigma abbastanza relazionale con un db non relazionale), ET- LINQ, jOOQ, ...) ho notato l'overload di codice spesso inutile dovuto oltre alla non conoscenza dell'architettura della libreria di ORM al linguaggio di programmazione.

                  [cancellato] Non lo è infatti, ma al testo scritto sì.
                  E se il linguaggio traduce SELECT * FROM prezzi WHERE item = "mela"; e SELECT * FROM prezzi WHERE item = "pera"; in due stringhe diverse invece che (SELECT * FROM prezzi WHERE item = ?;, "mela") e (SELECT * FROM prezzi WHERE item = ?;, "pera") , per il query planner sono due query diverse, e deve ricominciare l'analisi. Magari si ferma ad estrarre i literali e a renderla internamente pseudo-parametrica, ma è sempre lavoro in più che deve fare quando può comparare un hash di una stringa e accorgersi che, toh, ce l'ho già.

                  Si se viene mandato in SQL il ? sono d'accordo al 100% sulla maggiore efficienza (è evidente), ma la mia conoscenza sulle query, dovuta a varie influenze sul fatto di ridurre al minimo i Prepared statement (e la cosa bella che sento spesso parlare di questo da tante persone, anche autorevoli) in quanto a loro dire "sono una complicazioni affari semplici " (e si che lo trovi pure su alcuni libri di testo...) mi ha limitato le mie doti di investigatore mi ha fatto pensare veniva elaborata lato applicazione la query tramite l'ambiente virtuale appena citato da handymenny, d'altronde è sempre possibile fare un print della query buildata.

                  [cancellato] Non ho mai detto che non si debba fare o che servano a questo però 😉

                  Il mio era un: è meglio sanificare una volta e darlo in pasto ad una query nuova che filtrare e poi usare i prepared statement, ma sono d'accordo sul fatto che ci sono motivi per usarlo.

                  [cancellato] Conosco flotte di DBA (sic!) strenui sostenitori de "la coerenza relazionale deve essere garantita dall'applicazione" e che non mettono foreign key perché gli ostacolano i backup/restore (non hanno capito che basta sospenderle o eliminarle e ricrearle, in caso estremo...) e il loro modo di creare gli oggetti (per certa gente per dire è """normale""" che esistano prima le righe fattura della testata)... poi si chiedono perché sono sempre nervoso...

                  Questo è il minimo dei DBA. Nessun DBA è in pace con i charset per esempio....

                  Chiedo al moderatore se il testo scritto (con ovviamente riferimenti a commenti ed annotazioni) sul forum lo posso riutilizzare su un blog personale e/o in altri posti (tipo appunti, ovviamente senza scopo di lucro) in quanto è una bella discussione, soprattutto la parte su PDO.

                    [cancellato]
                    Quando ha raggiunto un "livello enterprise" e quando è stato superato ?

                    Per me, alla fine conta quello che ci devi fare.
                    Ogni linguaggio ha le sue peculiarità che lo rendono più o meno adatto per raggiungere uno scopo.. ma non è che venga limitato da questo.
                    Buona parte dei backend è misto in diversi linguaggi. Diverse volte ho visto combinazioni di php, python o php e nodeJS a seconda del compito da svolgere.

                      per il web il trend che vedo: webassembly (ottenuto da un altro linguaggio come rust ecc) + html +js,
                      jamstack (come architettura), graphql (data retrival) , rest( data input), database (il tipo giusto per lo scopo, KV, RDMS, Graph, Time Series ecc..)
                      Bisogna ricordarsi che: "Se il tuo unico strumento è un martello, tendi a trattare ogni problema come se fosse un chiodo"

                      Detto questo PHP è sempre stato un mediocre (=un hack e non ingegnerizzato) linguaggio di programmazione.

                        simonebortolin Chiedo al moderatore se il testo scritto (con ovviamente riferimenti a commenti ed annotazioni) sul forum lo posso riutilizzare su un blog personale e/o in altri posti (tipo appunti, ovviamente senza scopo di lucro) in quanto è una bella discussione, soprattutto la parte su PDO.

                        @matteocontrini

                          • [cancellato]

                          simonebortolin però in ambito datawarehouse non ci dovrebbe essere bisogno di filtrare le query o sbaglio?

                          La sicurezza la fai dappertutto. È ovvio che un sito accessibile pubblicamente o dalla maggior parte del personale di un'azienda è più a rischio, ma un'applicazione vulnerabile mette a repentaglio sia la sicurezza dei suoi dati sia quella del resto della rete. L'input malefico può arrivare da dove meno te lo aspetti 😀

                          In un datawarehouse le query preparate in realtà hanno meno senso perché ci sono query meno frequenti che richiedono molto tempo per essere completate - e magari anche il DB è costruito ad hoc per certi tipi di interrogazione.

                          Quindi il tempo di parsing e ottimizzazione della query è molto inferiore al tempo di elaborazione, e trovare il plan ottimale per ridurre al massimo i tempi può essere più importante, anche se ci mette un po' di più. Dove il tempo di parsing e quello di ottimizzazione diventano comparabili al tempo di esecuzione (e le query sono molto frequenti) è dove vuoi che siano riusate il più spesso possibile. I DB sono spesso anche in grado di individuare query "simili" - dipende da quanto cambiano, ma di solito c'è una cache, se a furia di inviare query sempre diverse i dati in cache non ci sono più le prestazioni decadono.

                          Come usi un DB SQL è ortogonale al linguaggio di programmazione - le query sono le stesse che l'applicazione sia in C o in PHP.

                            • [cancellato]

                            juststupid + html

                            No, adesso vogliono usare il Canvas direttamente perchè HTML è lento e non permette di avere sufficiente libertà. In pratica tentano di imitare le applicazioni native.

                            Webassembly serve esattamente togliere di mezzo Javascript

                            juststupid (=un hack e non ingegnerizzato) linguaggio di programmazione.

                            Stendiamo un velo pietoso su molti ultimi linguaggi inventati a casaccio da chi faceva meglio a darsi all'ippica. Non molto diversi da PHP, alla fine. Troppa roba pensata per risolvere il problema del momento senza alcuna visione globale e in avanti.

                              juststupid Detto questo PHP è sempre stato un mediocre (=un hack e non ingegnerizzato) linguaggio di programmazione.

                              Che bella definizione.

                              [cancellato] No, adesso vogliono usare il Canvas direttamente perchè HTML è lento e non permette di avere sufficiente libertà. In pratica tentano di imitare le applicazioni native.

                              Ho sentito, ho parecchi dubbi sull'accessibilità sinceramente.

                              [cancellato] In un datawarehouse le query preparate in realtà hanno meno senso perché ci sono query meno frequenti che richiedono molto tempo per essere completate - e magari anche il DB è costruito ad hoc per certi tipi di interrogazione.

                              Ecco io pensavo il contrario

                              Technetium Buona parte dei backend è misto in diversi linguaggi. Diverse volte ho visto combinazioni di php, python o php e nodeJS a seconda del compito da svolgere.

                              Si basata su architettura a microservizi e altre cose del genere.

                                • [cancellato]

                                simonebortolin Ecco io pensavo il contrario

                                Beh no ha senso... va ottimizzato quel che ti può dare un "ritorno d'investimento", inutile ottimizzare (pesantemente) e riutilizzare una query manuale o estemporanea che vai a lanciare una volta al giorno, anche se impiega quella frazione di punto percentuale di tempo in più pace e bene.
                                Diverso è invece andare a riusare il planning di una query che esegui decine o centinaia di volte al minuto, lì salvare millesimi di secondo a fine giornata ti porti a casa svariati minuti di tempo CPU risparmiato.

                                [cancellato] No, adesso vogliono usare il Canvas direttamente perchè HTML è lento e non permette di avere sufficiente libertà. In pratica tentano di imitare le applicazioni native.

                                Tranquillo, tra 5 anni chiuderanno il cerchio e torneranno a creare le applicazioni native perché saranno "la novità" e "ultraveloci".
                                Ridiamoci sopra valà...

                                Avendo usato PHP per un breve periodo, ritengo che rimarrà per sempre un linguaggio "legacy" come ne ha parlato molto l'OP.
                                L'avvento delle nuove tecnologie per web ha ucciso molto lo scripting ibrido HTML/PHP, ma di certo ad oggi ci sono ancora parecchi siti web che semplicemente non hanno intenzione di spostarsi dal codice che si è creato.
                                Quello che si sta facendo con le ultime versioni di PHP (vedi 8.0) è cercare di correggere tutte le incoerenze che sono rimaste per anni, ma di certo non potranno spostarsi molto per il discorso di prima.

                                Ha senso quindi usare PHP nel 2021? L'unico motivo per cui lo andrei a utilizzare, è se dovessi necessariamente utilizzare un codebase esistente di parecchi anni fa, altrimenti migrerei subito a soluzioni più "moderne", anche a costo di dover riscrivere tutto.

                                  simonebortolin no puoi fare if(isset($_POST))

                                  Sono piuttosto sicuro che in $_SERVER ci sia il metodo della richiesta
                                  Edit: te l’hanno già detto.
                                  Ma per me i problemi del PHP sono altri, ad esempio che se cerchi di accedere a delle chiavi inesistenti da solo un warning, la comparazione non è strict di default,…
                                  La versione 8 è un po’ meglio

                                    Informativa privacy - Informativa cookie - Termini e condizioni - Regolamento - Disclaimer - 🏳️‍🌈
                                    P.I. IT16712091004 - info@fibraclick.it

                                    ♻️ Il server di questo sito è alimentato al 100% con energia rinnovabile