Hm, om min array redan innehåller integers, vad gör detta för skillnad?
Hur som helst så verkar ditt exempel tyvärr inte fungera... :(
emission skrev:
Stoppa in lika många frågetecken som du har element i arrayen och execute:a med arrayen som parameter. Imploda inte.
Tyvärr, antalet element kan variera...och då måste jag bygga upp antalet frågetecken dynamiskt genom att konkatinera strängar. Blir inte smidigt. :l
Alltså själva grundproblemet är ju att PDO behandlar alla nummer som ett vanligt värde (en sträng i detta fall), vilket betyder att den färdiga SQL-frågan ser ut såhär:
SELECT username, password FROM users WHERE id IN('10,11,12,13')
Denna fråga returnerar såklart 0 poster eftersom den inte matchar någonting.
Jag skulle ju kanske kunna strunta i prepare() och hårdkoda mina nummer i SQL-frågan med hjälp av exempelvis sprintf() men då måste jag klura ut hur jag säkrar den från SQL-injectioner på ett bra sätt. :l
stevenet, hur ser din PDO-koppling ut? Min ser ut såhär:
$dbHost = new PDO('mssql:host=127.0.0.1;dbname=Labb', 'blabla', 'blabla');
Nu märkte jag att felrapporteringen var avslagen. x(
Nu får jag den här varningen med ditt kodexempel:
PHP Warning: PDOStatement::execute(): SQLSTATE[HY000]: General error: 10007 Syntax error converting the varchar value '136483, 138565, 130255, 109421' to a column of data type int.
Tack stevenet! Din senaste lösning fungerar och är smidig. :)
Men nog tycker jag allt att PDO borde utrustas med en ny typ av placeholder som kan användas för att bygga upp själva SQL-frågan också.
Samma problem uppstår ju om man exempelvis vill använda placeholders för tabell-namn.
Tack stevenet! Din senaste lösning fungerar och är smidig. :)
Men nog tycker jag allt att PDO borde utrustas med en ny typ av placeholder som kan användas för att bygga upp själva SQL-frågan också.
Samma problem uppstår ju om man exempelvis vill använda placeholders för tabell-namn.
Jo, men det är inte upp till PDO. Placeholder är ett missvisande namn. Egentligen är det SQL-parametrar och dessa kan inte användas för arrayer (därav mitt tidigare svar) och inte heller för tabellnamn (eftersom det skulle förstöra hela idén med prepared statements).
Om det är placeholders du vill åt så är det sprintf som hanterar det. Vill du njuta av säkerheten och prestandan som parametriserade frågor ger så får du ocksp leva med begränsningarna.
En lagom lång lista med frågetecken kan du göra med
ltrim(str_repeat(",?",count($id)),",")
264 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e