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;