update statement funcion bind_result php mysql mysqli sqlbindparameter

funcion - statement php mysqli



mysqli bind_param para una serie de cadenas (3)

¡No puede vincular dos variables con un solo question mark !

Para cada variable que atas, necesitas un question mark

"bind_param" comprueba cada variable si coincide con los requisitos. luego, el valor de la cadena se coloca entre comillas.

Esto no funcionará.

"SELECT name FROM table WHERE city IN (?)"; ( becomes too ) $q_prepared->bind_param("s", $cities); "SELECT name FROM table WHERE city IN (''city1,city2,city3,city4'')";

debe ser.

"SELECT name FROM table WHERE city IN (?,?,?,?)"; ( becomes too ) $q_prepared->bind_param("ssss", $city1,$city2,$city3,$city4); "SELECT name FROM table WHERE city IN (''city1'',''city2'',''city3'',''city4'')";

$query_prepared->bind_param quotes string params uno por uno.
Y el número de variables y la longitud de los tipos de cadena deben coincidir con los parámetros en la declaración.

$query_str= "SELECT name FROM table WHERE city IN (''Nashville'',''Knoxville'')";

se convertirá

$query_str= "SELECT name FROM table WHERE city IN (?,?)";

ahora bind_param debe ser

bind_param("ss",$arg1,$arg2)

con este

$query_str= "SELECT name FROM table WHERE city IN (?)";

y bind_param con

bind_param("s",$cities)

usted obtiene

$query_str= "SELECT name FROM table WHERE city IN (''Nashville,Knoxville'')";

Es por eso que una matriz no funciona.
La única solución para este hecho es call_user_func_array

si inicia un enunciado, lo siguiente es innecesario

$query_prepared = $mysqli->stmt_init(); if($query_prepared && $query_prepared->prepare($query_str)) {

Esto es correcto

$query_prepared = $mysqli->stmt_init(); if($query_prepared->prepare($query_str)) {

si no quieres usar call_user_func_array
y solo tienes un pequeño recuento de argumentos
puedes hacerlo con el siguiente código

[...] $cities= explode(",", $_GET[''cities'']); if (count($cities)>3) { echo "too many arguments"; } else { $count = count($cities); $SetIn = "("; for($i = 0; $i < $count; ++$i) { $code.=''s''; if ($i>0) {$SetIn.=",?";} else {$SetIn.="?";} } $SetIn.=")"; $query_str= "SELECT name FROM table WHERE city IN ".$SetIn; // with 2 arguments $query_str will look like // SELECT name FROM table WHERE city IN (?,?) $query_prepared = $mysqli->stmt_init(); if($query_prepared->prepare($query_str)) { if ($count==1) { $query_prepared->bind_param($code, $cities[0]);} if ($count==2) { $query_prepared->bind_param($code, $cities[0],$cities[1]);} if ($count==3) { $query_prepared->bind_param($code, $cities[0],$cities[1],$cities[2]); // with 2 arguments $query_prepared->bind_param() will look like // $query_prepared->bind_param("ss",$cities[0],$cities[1]) } $query_prepared->execute(); } [...] }

Sugeriría que lo pruebes con call_user_func_array para alcanzarlo.

busca la solución de nick9v
mysqli-stmt.bind-param

No puedo conseguir que esto funcione. Pasé muchas horas en eso ahora.

Esto funciona:

$mysqli = new mysqli("localhost", "root", "root", "db"); if(!$mysqli || $mysqli->connect_errno) { return; } $query_str= "SELECT name FROM table WHERE city IN (''Nashville'',''Knoxville'')"; if($query_prepared && $query_prepared->prepare($query_str)) { $query_prepared->execute();

Pero esto NO puedo hacer que funcione con un bind_param como este:

$query_str= "SELECT name FROM table WHERE city IN (?)"; $query_prepared = $mysqli->stmt_init(); if($query_prepared && $query_prepared->prepare($query_str)) { $cities= explode(",", $_GET[''cities'']); $str_get_cities= "''".implode("'',''", $get_cities)."''"; // This equals ''Nashville'',''Knoxville'' $query_prepared->bind_param("s", $cities); $query_prepared->execute();

¿Qué estoy haciendo mal?

También probé call_user_func_array , pero parece que la sintaxis no es correcta. ¡Cualquier ayuda sería muy apreciada!

EDITAR: Probé rigurosamente las sugerencias de moskito-x y un montón de ejemplos enumerados aquí y en otros lugares SO y sitios web aleatorios, y nada funciona. Creo que el problema podría ser PHP 5.4, que es en lo que está configurado mi MAMP en este momento.


También estaba teniendo problemas con esto, y lo he conseguido trabajando con eval antes de descubrir que la mayoría de la gente usa call_user_func_array

$fields = array(''model'',''title'',''price''); // fields in WHERE clause $values = array( // type and value for each field array(''s'',''ABCD-1001''), array(''s'',''[CD] Test Title''), array(''d'',''16.00'') ); $sql = "SELECT * FROM products_info WHERE "; // start of query foreach ($fields as $current){ // build where clause from fields $sql .= ''`'' . $current . ''` = ? AND ''; } $sql = rtrim($sql,''AND ''); // remove last AND $stmt = $db->prepare($sql); $types = ''''; $vals = ''''; foreach ($values as $index => $current_val){ // build type string and parameters $types .= $current_val[0]; $vals .= ''$values['' . $index . ''][1],''; } $vals = rtrim($vals,'',''); // remove last comma $sql_stmt = ''$stmt->bind_param("'' . $types . ''",'' . $vals . '');''; // put bind_param line together eval($sql_stmt); // execute bind_param $stmt->execute(); $stmt->bind_result($col1,$col2,$col3,$col4,$col5,$col6); // this could probably also be done dynamically in the same way while ($stmt->fetch()){ printf("%s %s %s %s %s %s/n", $col1,$col2,$col3,$col4,$col5,$col6); }


utiliza call_user_func_array así:

$stmt = $mysqli->prepare("INSERT INTO t_file_result VALUES(?,?,?,?)"); $id = ''1111''; $type = 2; $result = 1; $path = ''/root''; $param = array(''siis'', &$id, &$type, &$result, &$path); call_user_func_array(array($stmt, ''bind_param''), $param); $stmt->execute(); printf("%d row inserted. /n", $stmt->effected_rows); $stmt->close;