ventajas statement sentencias prepared preparadas desventajas consulta php mysql mysqli prepared-statement

php - statement - ¿Dónde está el error de consulta de declaración preparada mysqli?



sentencias preparadas php pdo (2)

Estoy tratando de crear una declaración preparada mysqli donde importo tablas desde una base de datos odbc conectada a una base de datos mysql, obtengo este error con la consulta de tabla amplia de 106 columnas.

Usted tiene un error en su sintaxis SQL; revise el manual que corresponde a su versión del servidor MySQL para la sintaxis correcta para usar cerca de ''? (ID, columna1, columna2, columna3, columna4, ''en la línea 1''

Cuando hago eco de la consulta aquí, es ...

INSERTAR EN ? (ID, columna1, columna2, columna3, columna4, ... 106 columnas totales ...) VALORES (?,?,?,?,?,?,?,?,?,?,?,?,?,? ,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)

$sql = "SELECT * FROM $table WHERE $key = ''$acct''"; $link = getODBCConnection(); $result = odbc_do($link, $sql); $data = array(); while ($row = odbc_fetch_array($result)) { //store all query rows as array array_push($data, $row); } //insert into mysql table of the same name //get column count from first row $columns = count($data[0]); $params = str_repeat(" ?,",$columns); $params = rtrim($params,'',''); $types = str_repeat("s",$columns+1); $fields = implode(", ", array_keys($data[0])); $sql = "INSERT INTO ? ($fields) VALUES ($params) ON DUPLICATE KEY UPDATE"; echo $sql."<br>"; $link = getSalesConnection(); $stmt = $link->prepare($sql); var_dump($link->error); foreach ($data as $row) { $stmt->bind_param($types, $table, implode(", ",array_values($row))); $stmt->execute(); }

Lo he intentado usando el bind_param estándar y también usando el método call_user_func_array (). Intenté citar mis cadenas de parámetros y los nombres de las columnas, sin efecto. Si hubiera un error con mis tipos de bind_param, no debería haber un error en la declaración de preparación, ¿o sí? Pero hay algún problema con el SQL yendo al comando de preparación que no puedo identificar. ¡Por favor ayuda!


Los parámetros de consulta se pueden usar en lugar de solo valores escalares. No puede parametrizar nombres de tablas, columnas, SQL, palabras clave, listas de valores, etc.

  • INCORRECTO: SELECT ?, b, c FROM t WHERE a = 1 ORDER BY b ASC
    El valor del parámetro será un valor literal, no el nombre de una columna.

  • INCORRECTO: SELECT a, b, c FROM ? WHERE a = 1 ORDER BY b ASC SELECT a, b, c FROM ? WHERE a = 1 ORDER BY b ASC
    Error de sintaxis.

  • INCORRECTO: SELECT a, b, c FROM t WHERE ? = 1 ORDER BY b ASC SELECT a, b, c FROM t WHERE ? = 1 ORDER BY b ASC
    El valor del parámetro será un valor literal, no el nombre de una columna.

  • INCORRECTO: SELECT a, b, c FROM t WHERE a IN (?) ORDER BY b ASC
    El valor del parámetro será un único valor literal, no una lista de valores, incluso si pasa una cadena de valores separados por comas.

  • INCORRECTO: SELECT a, b, c FROM t WHERE a = 1 ORDER BY ? ASC SELECT a, b, c FROM t WHERE a = 1 ORDER BY ? ASC
    El valor del parámetro será un valor literal, no el nombre de una columna.

  • INCORRECTO: SELECT a, b, c FROM t WHERE a = 1 ORDER BY b ?
    Error de sintaxis.

Básicamente, si pudieras escribir un literal de cadena, literal de fecha o literal numérico en lugar del parámetro de consulta, debería estar bien. De lo contrario, debe interpolar el contenido dinámico en la cadena SQL antes de prepararlo ().


Parece que la función bind_param () no reemplaza a la primera ''?'' que define el nombre de la tabla. Intente poner el nombre de la tabla manualmente en la cadena preparada primero y solo use ''?'' marcadores donde está esperando valores.