In Kohana 3, ora è possibile legare il nome params nelle query, ma come faccio a scappare quelli che non possono legare?

StackOverflow https://stackoverflow.com/questions/2204149

  •  18-09-2019
  •  | 
  •  

Domanda

In Kohana 3, posso associare un parametro in una query in questo modo

$query = 'SELECT name FROM users WHERE id = :id';

Questa è pulito, ma a volte voglio altre cose per essere configurabile, come il nome della tabella. Quando uso una param chiamato per nome della tabella, viene a mancare. Ho solo la costruzione della stringa in queste circostanze.

La mia domanda è: come posso sfuggire caratteri potenzialmente cattivi quando si fa questo tipo di edificio stringa? In Kohana 2.x, si potrebbe fare $this->db->escape() ma poiché Kohana 3 è radicalmente diverso, immagino ci sia un modo nuovo?

È stato utile?

Soluzione

Giusto per aggiungere alla risposta di Mark Byers, la ragione per cui la parametrizzazione del nome della tabella sta fallendo è che i parametri sono fuggiti come valori , mentre un nome di tabella è un identificatore . Che cosa sta accadendo è che probabilmente il nome della tabella viene avvolto tra virgolette, mentre dovrebbe essere di essere avvolto in backticks invece.

Tuttavia, come dice Marco, la necessità di sfuggire i nomi di tabella suggerisce cattivo design. Essi dovrebbero essere o duro codificati o memorizzati in qualche file di configurazione il cui contenuto si può fidare di non avere bisogno di fuggire in ogni modo. Cercando di coprire tutte le basi a tal punto che non ti fidi la propria configurazione è più probabile una perdita di tempo.

Altri suggerimenti

Non ho mai usato Kohana, quindi mi scuso se questo commento è del tutto irrilevante, ma ho un paio di commenti su ciò che si sta cercando di fare:

  

Quando uso una param chiamato per nome della tabella, viene a mancare.

Suppongo che questo è perché si basa sul meccanismo di parametro del database sottostante, e non so di qualsiasi database che permette di dare un nome di tabella come parametro in una query. Quindi sì, molto probabilmente si dovrà costruire una stringa da soli.

  

Come posso sfuggire caratteri potenzialmente cattivi quando si fa questo tipo di edificio stringa?

Questa domanda sembra strano ... o si hanno i caratteri potenzialmente negative in alcuni dei vostri nomi di tabella ... se sì, perché? Oppure si sta ricevendo il nome della tabella da una fonte non attendibile (utente?). Questo suona come una cattiva idea per me. Che cosa succede se si cerca di leggere da una tabella che non avrebbero dovuto avere accesso a? Non sarebbe meglio avere un elenco ben definito di tablenames ammissibili e controllare che la tabella esiste in quella lista, invece di fuggire nomi delle tabelle potenzialmente cattivo?

E ho un'ultima osservazione: se si è in grado di cambiare il nome della tabella in una query e funziona ancora, questo è forse un segno che il database non è normalizzata in modo corretto. Forse è possibile combinare le tabelle e aggiungere una colonna aggiuntiva con informazioni sul raggruppamento, e utilizzare una clausola WHERE per selezionare i dati desiderati? Avrei bisogno di sapere di più sul vostro modello di suggerire qualcosa di più concreto.

Non sono sicuro se questo aiuta a rispondere alla tua domanda a tutti, ma questi erano i miei pensieri su leggendo la tua domanda. Spero che si può usare un po '.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top