1

Tengo un Web Service que está conectado a una base de datos MSSQLServer, funciona bien, el único problema que tengo es que cuando ejecuto alguna Query que tenga que mostrar más de un registro, solo me muestra el primero. Por ejemplo le digo que quiero todos los registros en la base de datos que contengan "papel" en el nombre, pero solo muestra el primero de los registros que encuentra, necesito que muestre todos los que encuentre con esa característica. Adjunto el código del WS

ini_set('display_errors', '1');
$number_of_posts = $_GET['prod_pos'];
$picker_option   = $_GET['picker'];
$format          = 'json';
$serverName      = "******";
$uid             = "sa";
$pwd             = "*******";
$connectionInfo  = ["UID" => $uid, "PWD" => $pwd, "Database" => "SADOC"];

$conn = sqlsrv_connect($serverName, $connectionInfo);
if ($conn) {
} else {
    echo "Unable to connect.</br>";
    die(print_r(sqlsrv_errors(), true));
}

$tsql = "SELECT inv_inventario.inv_cod, inv_inventario.inv_des_lar, inv_inventario.inv_cba, sal_saldos.sal_can,
                    sal_saldos.sal_cos, gai_ganancia_x_inventario.gai_pre
                    FROM ((INV_INVENTARIO INNER JOIN SAL_SALDOS ON inv_inventario.inv_cod = sal_saldos.inv_cod)
                    INNER JOIN GAI_GANANCIA_X_INVENTARIO ON inv_inventario.inv_cod = gai_ganancia_x_inventario.inv_cod) where inv_inventario." . $picker_option . " like '%" . $number_of_posts . "%'";
$stmt = sqlsrv_query($conn, $tsql);
if ($stmt === false) {
    echo "Error in executing query.</br>";
    die(print_r(sqlsrv_errors(), true));
}

$posts = [];
while ($post = sqlsrv_fetch_array($stmt)) {
    $posts = [$post];
}
$final_res = json_encode(['producto' => $posts]);

if ($format == 'json') {
    header('Content-type: application/json');
    echo $final_res;
}

$stmt = null;
$conn = null;
Eduardo Javier Maldonado
  • 2,455
  • 7
  • 20
  • 41

1 Answers1

2

Se puede intuir que el error está en el ciclo while. Solo está asignando el array a la variable, como se trata de un ciclo $posts siempre será el último registro retornado por su consulta,

while ($post = sqlsrv_fetch_array($stmt)) {
    $posts = [$post]; // asignación
}

Para solucionar pueden haber más de 1 solución, podría utilizar array_push por ejemplo para solucionar el error.

while ($post = sqlsrv_fetch_array($stmt)) {
    array_push($posts, $post);
}
Eduardo Javier Maldonado
  • 2,455
  • 7
  • 20
  • 41
Dev. Joel
  • 23,229
  • 3
  • 25
  • 44
  • Intente con tu solución pero ahora no me muestra ningun registro – Jeffrey Cedeño Apr 12 '20 at 04:33
  • @JeffreyCedeño `array_push($posts ,$post);` se me pasó el `array`. he actualizado, ahora debería funcionar. – Dev. Joel Apr 12 '20 at 04:55
  • Es la unica parte del código que tengo que modificar? Porqué sigue sin mostrarme ningun resultado, me envía la pagina en blanco. – Jeffrey Cedeño Apr 12 '20 at 05:43
  • @JeffreyCedeño Sí, es lo único que se ve que puede estar causando esto. Teniendo en cuenta que su query está correcta y retorna resultados. – Dev. Joel Apr 12 '20 at 16:25
  • Tu respuesta es correcta, lo que sucede es que mi base de datos en el campo nombre tiene ciertos caracteres especiales, por ejemplo Ñ o $ y segun veo cuando encuentra alguno en medio de la consulta solo muestra el primer registro. – Jeffrey Cedeño Apr 12 '20 at 19:24
  • @JeffreyCedeño entonces, recomiendo leer [está pregunta relacionada con eso](https://es.stackoverflow.com/questions/59489/por-que-el-car%c3%a1cter-inspector-aparece-en-algunos-datos-obtenidos-de-la-base/59510#59510) – Dev. Joel Apr 12 '20 at 20:19