En primer lugar, sé sobre la inyección de sql y que mi código no es infalible, propenso a la inyección, etc. Trabajaré en eso a continuación.
Ahora: desde mi aplicación de Android a mi archivo PHP, envío una matriz JSON de números de teléfono como:
[{"phone_number":"+12345678"}, {"phone_number":"+23456789"}, {"phone_number":"34567890"}, {"phone_number":"45678901"} etc... etc... Estos son contactos en el teléfono del usuario de mi aplicación. Si estos contactos son personas que también son usuarios de mi aplicación, quiero insertar esos números en mi tabla de contacts .
Pero no puedo hacer que funcione. mysqli_fetch_assoc no funciona correctamente. no sé por qué
En mi tabla de contacts tengo 3 columnas: un auto increment , user_id y contact_id . Los primeros dos valores se insertan correctamente, pero contact_id siempre se coloca como '0', lo cual es incorrecto.
Aquí está mi código:
require('dbConnect.php'); //this is me, +567890123, my user_id in the user table $user_id = '20'; //post all contacts in my phone as a JSON array $json = $_POST['phonenumber']; $array = json_decode($json); foreach ($array as $value) { $phonenumber = $value->phone_number; $sql = "SELECT username FROM user WHERE username = '$phonenumber'"; $result = mysqli_query($con, $sql); $num_rows = mysqli_num_rows($result); if ($num_rows > 0) { echo "phonenumber is " . $phonenumber . "<br>"; // we want to put $phonenumber in the contacts table, as one of +567890123 contacts // In the user table get the associated rows of $phonenumber while ($row = mysqli_fetch_assoc($result)) { // get the associated user_id in that row, that's what we want to put into the contacts table $contact_id = $row['user_id']; $insert_into_contacts_command = "INSERT INTO contacts VALUES(NULL, '$user_id','$contact_id')"; $insert_into_contacts_table = mysqli_query($con, $insert_into_contacts_command); } } //if +353864677745 is NOT in the user table... else { echo 'not a match.'; } }$contact_id = $row['user_id']; Aquí $contact_id será null , porque está intentando acceder al campo $row['user_id'] de $row que no existe.
En realidad, solo hay un nombre de username de campo en su conjunto de resultados, como especificó:
$sql = "SELECT username FROM user WHERE username = '$phonenumber'";Intenta cambiar tu consulta a esto:
$sql = "SELECT user_id, username FROM user WHERE username = '$phonenumber'";Su consulta selecciona la columna nombre de username , no ID de userid .
No ha publicado nada sobre el user de la tabla, por lo que es difícil sugerir una nueva consulta, pero supongo que es la siguiente:
$stmt = mysqli_prepare($con, "SELECT userid FROM user WHERE username = ?"); $stmt->bind_param("s", $phonenumber); $stmt->execute(); $stmt->bind_result($userid); while ($stmt->fetch()) { // Work with $userid }Notará que esto usa una declaración preparada con un parámetro enlazado. De esa manera, su código no es propenso a las inyecciones de SQL.