Tengo y matriz con dos valores de y quiero usarlo con sql EN operador en la consulta de selección.

Aquí es la estructura de mi mesa

id comp_id
1   2
2   3
3   1

Tengo una matriz $arr que tener dos valores Array ( [0] => 1 [1] => 2 )

Quiero recuperar el registro de id_comp 1 y id_comp 2. Así que escribí la siguiente consulta.

SELECT * from table Where comp_id IN ($arr)

Pero no devuelve los resultados.

  • El paso 1 es para depurar su propio código. Si usted imprime la consulta que se estaban enviando a MySQL, verías que SELECT * from table Where comp_id IN (Array) no es correcto. Tratando de concatenar una matriz en una cadena que no se convierten automáticamente en una lista separada por comas de las palabras.
  • El paso 2 es la búsqueda de MODO que para saber cuántos miles de veces esta pregunta ya ha sido contestada
  • Contesté en este problema, se va a resolver su problema. stackoverflow.com/questions/920353/…
InformationsquelleAutor Ahmad | 2012-03-08

13 Comentarios

  1. 60

    Como usted han llanura enteros puede hacer…

    $sql = "SELECT * FROM table WHERE comp_id IN (".implode(',',$arr).")";

    (como se sigue saliendo, información adicional… )

    Si se trabaja con cadenas (particularmente que no son de confianza) de entrada, puede hacer

    $sql = "SELECT * FROM table WHERE comp_id IN 
            ('".implode("','",array_map('mysql_real_escape_string', $arr))."')";

    pero no frente a valores como NULL. Y añadir citas ciegamente en torno a valores numéricos, que no no trabajo si el uso estricto de mysql modo. https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#idm140082377917056
    … es decir, SÓLO use esta opción si realmente trabajar con cadenas de caracteres (como VARCHAR), NO en las columnas numéricas.

    La Necesidad a llamar algo así como mysql_real_escape_string es así que las citas en las cadenas es tratado adecuadamente! (así como la prevención de las Inyecciones de SQL!)


    … si quiero trabajar conque no son de confianza‘ números, puede utilizar intval o floatval

    $sql = "SELECT * FROM table WHERE comp_id IN (".implode(",",array_map('intval', $arr)).")";

    para higienizar la entrada. (sin las comillas alrededor de la entrada.

    • He utilizado este método y funciona bien, pero con una advertencia de Warning: implode() [function.implode]: Invalid arguments passed in C:\wamp\www\x\x\x\xxx.php on line 81
    • Su $arr es más probable que no un array. Compruebe que se construye correctamente.
    • Obtendrá el mismo resultado, pero no es la mejor respuesta, y descubrió a ataques de Inyección de SQL, me respondió sobre este problema, se va a resolver su problema. stackoverflow.com/questions/920353/…
    • Esto sólo funcionará para los valores numéricos de la matriz. Si $arr contiene cadenas, que será sin comillas después de la implosión y el motor de base de datos no va a ser feliz, por ejemplo, SELECT * FROM table WHERE id IN (foo, bar, baz); no es de SQL válida para la mayoría de las bases de datos.
    • Así la implicación de la cuestión se había números, aunque no era absolutamente explícito.
  2. 14

    usted necesita para convertir la matriz en una cadena separada por comas:

    $condition = implode(', ', $arr);

    Y, además, es posible que desee escapar de los valores de la primera (si no está seguro acerca de la entrada):

    $condition = implode(', ', array_map('mysql_real_escape_string', $arr));
    • Umm, no se puede llamar mysql_real_escape_string en los datos, sería necesario añadir comillas alrededor de los valores (othrwise la creación de SQL no válido).
  3. 5

    $arr es un array de php, el servidor sql que se necesita para enviar una cadena de texto que será analizado
    usted necesita para convertir su matriz en una lista como 1, 2, etc..

    para hacer esto, usted puede usar la función http://php.net/implode

    así que antes de ejecutar la consulta intentar

    $arr = implode ( ', ', $arr);
    • He utilizado este método y funciona bien, pero con una advertencia de Warning: implode() [function.implode]: Invalid arguments passed in C:\wamp\www\x\x\x\xxx.php on line 81
    • que extraño.. tal vez para el caso de que usted no tiene los elementos de la matriz o de la variable no está inicializado aún.. ?
    • Ver mi comentario anterior. Esto no funciona para la cadena de valores en la matriz.
    • seguro, no tienes derecho, lo que responde que sólo se da en la pregunta publicado por la OP… para las cadenas tendría que citar a y escapar de los valores
  4. 5

    Que usted necesita a la implosión de la matriz con ‘,’ coma

    $imploded_arr = implode(',', $arr);
    
    SELECT * from table Where comp_id IN ($imploded_arr)
  5. 4

    sólo puede pasar a la cadena a mysql como consulta, a fin de tratar este

    mysql_query("SELECT * FROM table WHERE comp_id IN (".implode(',',$arr).")");
  6. 3

    Usted va a mezclar PHP y SQL – para el IN operador SQL, necesita un formato como:

    SELECT * from table WHERE comp_id IN (1,2)

    Así que para conseguir que en PHP que usted necesita para hacer algo como:

    $sql = "SELECT * from table Where comp_id IN (".implode(',',$arr).")"

    Tener en cuenta que esto sólo funciona si la matriz se compone de los números enteros. Tienes que escapar de cada elemento, si son cadenas.

  7. 2

    Necesita algo como:

    $sql = "SELECT * from table where comp_id in (".implode(',',$arr.")";
  8. 2

    Usted necesita para convertir en realidad su $arr a una cadena. La forma más sencilla con lo que estamos haciendo sería el uso de implode()

    $query = 'SELECT * from table Where comp_id IN (' . implode(',', $arr) . ')';

    Ahora si echo su consulta verás que en lugar de la matriz en la IN declaración, será la palabra «Matriz»

  9. 2

    Usted necesita para convertir la matriz en una cadena para su uso en la consulta:

    $list = implode(',', $arr);

    Entonces se puede utilizar en la cláusula in:

    SELECT * from table Where comp_id IN ($list)
    • no funciona para los valores de cadena, ya que con la implosión de obtener una cadena y no por separado los valores de cadena según sea necesario para la consulta sql
    • la respuesta correcta es aquí stackoverflow.com/questions/18072185/…
  10. 2

    Todas las personas aquí están proponiendo lo mismo, pero tengo una advertencia en WordPress debido a un simple error. Necesita agregar comas para su implosión de la cadena. Para ser precisos algo como esto.

    $query = "SELECT *FROM table Where comp_id IN ( '" . implode( "', '", $sanitized_brands ) . "' )";

    La esperanza de que ayude a alguien como yo. 🙂

  11. 2

    Como por @barryhunter ‘s respuesta que sólo funciona en la matriz que contiene entero sólo:

    $sql = "SELECT * from table Where comp_id IN (".implode(',',$arr).")";

    He hecho algunos ajustes para hacer que funcione para el arreglo de cadenas de caracteres:

    $sql = "SELECT * from table Where comp_id IN ('".implode("','",$arr)."')";
    • solución inteligente para la cadena de texto de los elementos! trabaja en Laravel, cuando se utiliza DB::raw
  12. 0

    Existen algunos riesgos de la inyección de SQL en algunas de las respuestas anteriores. Podría estar bien si usted está completamente seguro $arr ser esterilizada, y permanecer de esa manera). Pero si usted no está completamente seguro, usted puede ser que desee para mitigar dichos riesgos mediante $stmt->bindValue. Aquí hay una manera de hacerlo:

    # PHP
    $in_list = array();
    for ($i = 0; $i < count($arr); $i++) {
        $key = 'in_param_' . i;
        $in_list[':' . $key] = array('id' => $arr[$i], 'param' => $key);
    }
    $keys = implode(', ', array_keys($in_list));
    
    //Your SQL ...
    $sql = "SELECT * FROM table where id IN ($keys)";
    
    
    foreach ($in_list as $item) {
        $stmt->bindValue($item['param'], $item['id'], PDO::PARAM_INT);
    }
    $stmt = $this->getConnection()->prepare($sql)->execute();
  13. 0

    Si su matriz de Enteros :

    $searchStringVar = implode(",",$nameIntAryVar);
    $query="SELECT * from table NameTbl WHERE idCol='$idVar' AND comp_id IN ($searchStringVar)";

    Si su matriz de Cadenas :

    $searchStringVar = implode("','",$nameStringAryVar);
    $query="SELECT * from table NameTbl WHERE idCol='$idVar' AND comp_id IN ('$searchStringVar')";

Dejar respuesta

Please enter your comment!
Please enter your name here