0

Necesito realizar una consulta a la BD en Mysql pero siempre obtengo este error: SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data

Y este sería el codigo.

Aquí presiono un boton llamado Actualizar.

'use stric'
$(document).ready(function(){
    $("#actualizar").on('click',function(){
        obj = { "table":"solicitudes" };
        dbParam = JSON.stringify(obj);
        xhr = new XMLHttpRequest();
            xhr.onreadystatechange = function() {
              if (this.readyState == 4 && this.status == 200) {
                myObj = JSON.parse(this.responseText);
                for (x in myObj) {
                  txt += myObj[x].name + "<br>";
                }
                $("#request").innerHTML = txt;
              }
            };
xhr.open("POST", "php/Spend.php", true);
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhr.send("x=" + dbParam);
    });
});

En la consola obtengo el mismo error que en PHP "SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data" indica que el error esta en la línea: myObj = JSON.parse(this.responseText); entiendo que lo entrega por que es la respuesta de PHP. Aqui el codigo de PHP.

<?php   
header("Content-Type: application/json; charset=UTF-8");
$obj = json_decode($_POST["x"], false);
print_r($obj);

$conn = new mysqli("localhost", "root", "", "BD");
$stmt = $conn->prepare("SELECT `titulo_solicitud` FROM ? ");
$stmt->bind_param("s", $obj->table);
$stmt->execute();
$result = $stmt->get_result();
$outp = $result->fetch_all(MYSQLI_ASSOC);

echo json_encode($outp);


$conn->close(); ?>

Y esta es la respuesta del servidor en la consola de desarrollador:

stdClass Object
(
    [table] => solicitudes
)
<br />
<b>Fatal error</b>:  Uncaught Error: Call to a member function bind_param() on boolean in /opt/lampp/htdocs/sf/php/Spend.php:8
Stack trace:
#0 {main}
  thrown in <b>/opt/lampp/htdocs/sf/php/Spend.php</b> on line <b>8</b><br />

La línea 8 es $stmt->bind_param("s", $obj->table); No entiendo en donde esta el error de sintaxis

ivaN
  • 21
  • 1
  • 4
  • ¿Por qué emplear `xhr = new XMLHttpRequest();` si usas `Jquery` ? – fredyfx Mar 29 '19 at 17:38
  • Por que tampoco pude hacer que que php me regresara los datos como un objeto. https://es.stackoverflow.com/questions/248983/recibir-datos-de-php-con-ajax/248995#248995 Ya llevo algunos dias con este problema :/ – ivaN Mar 29 '19 at 17:51
  • tu escenario se parece mucho a este otro: https://es.stackoverflow.com/a/238021/822 – fredyfx Mar 29 '19 at 18:01
  • Si, es muy similar estoy intentando las respuesta de los comentarios y espero que ahora si el json_encode me genere el objeto de mi array por que fui ahí donde me estanque la vez anterior – ivaN Mar 29 '19 at 18:28

1 Answers1

0

debes hacerlo asi:

tu error esta en la query

$stmt = $conn->prepare("SELECT `titulo_solicitud` FROM ? ");

no especificaste la tabla ni tampoco el campo
bind_param solo funciona con nombres de columnas no con nombres de tabla.

puedes hacer esto:

//nombres de tablas permitidos evita cualquier problema
$table_allow["tabla","tabla1","tabla2","tabla3"];
//filtramos el string
$table= filter_var($obj->table, FILTER_SANITIZE_STRING);
//evita acceder a tablas que no este permitidas
if(in_array($table,$table_allow)){
    $stmt = $conn->prepare("SELECT `titulo_solicitud` FROM {$table}");
    $stmt->execute();
    $out =[];
    while($row = $result->fetch_all(MYSQLI_ASSOC)){
            $out[]=$row["titulo_solicitud"];
    }
  echo json_encode($outp,true);
}

javascript cambios:

if (this.readyState == 4 && this.status == 200) {
               txt="";
                myObj = JSON.parse(this.responseText);
                for (let x of myObj) {
                  txt += `${x}<br>`;
                }
                $("#request").innerHTML = txt;
              }
Bryro
  • 8,278
  • 1
  • 7
  • 24
  • Lo ordene de esta manera `$table= filter_var($obj->table, FILTER_SANITIZE_STRING); $stmt = $conn->prepare("SELECT titulo_solicitud FROM {$table}"); $stmt->bind_param("s",$obj->$table);` y ahora obtengo esto mysqli_stmt::bind_param(): Number of variables doesn't match number of parameters in prepared statement Gracias por la ayuda – ivaN Mar 29 '19 at 17:58
  • no puedes usar `bind_param()` ya que no estas pasando parametros = nombres de columnas.............. en terminos simples elimina esa linea! – Bryro Mar 29 '19 at 18:00
  • Ya obtuve el array pero el json_encode no me genera el objeto json que necesito para JS https://es.stackoverflow.com/questions/248983/recibir-datos-de-php-con-ajax/248995#248995 – ivaN Mar 29 '19 at 18:27
  • Byro, esto puede prestarse a confusión: *«bind_param solo funciona con nombres de columnas no con nombres de tabla.»* Realmente funciona con **valores**, o sea lo que se pasa son los valores correspondientes a cada columna. Si intentas sustituir el **nombre** columna en sí usando `bind_param` tampoco será permitido, porque esta función es para pasar **valores** no nombres de tablas o de columnas. – A. Cedano Mar 29 '19 at 23:13
  • Hola!! Ya lo resolví, el problema esta en la BD tenía acentos en algunos registros, aunque esta configurado con UTF-8 que tengo entendido que acepta acentos, genera algunos errores en el json_encode(); Amigo muchas gracias por tu tiempo y apoyo el ejemplo que me pusiste si me funciono al final. – ivaN Mar 30 '19 at 04:17