0

I have 2 tables:

Users

ID   usr_login  user_email        display_name
1    john       john@gmail.com    John Jones    
2    steve      steve@att.com     Steve Jobs    
3    tom        tom@verizon.net   Tom Thumb

usermeta

umeta_id  user_id   meta_key    meta_value    
1         1         phone       8005551212    
2         1         email       john@gmail.com    
3         1         b_date      12/25    
20        2         phone       2025554567    
21        2         email       steve@att.com    
22        2         b_date      11/01    
40        3         phone       9095559876    
41        3         email       tom@verizon.net    
42        3         b_date      01/30

Nick was able to help me put together an SQL query that displays the data successfully in this format:

User1-DisplayName     User1-eMailAddress     User1-Phone     User1-Bdate
User2-DisplayName     User2-eMailAddress     User2-Phone     User2-Bdate
User3-DisplayName     User2-eMailAddress     User3-Phone     User3-Bdate

Here is Nick's SQL query:

SELECT u.display_name,
       COALESCE(e.meta_value, '') AS user_email,
       COALESCE(p.meta_value, '') AS phone,
       COALESCE(b.meta_value, '') AS bdate
FROM users u
LEFT JOIN usermeta e ON e.user_id = u.ID AND e.meta_key = 'email'
LEFT JOIN usermeta p ON p.user_id = u.ID AND p.meta_key = 'phone'
LEFT JOIN usermeta b ON b.user_id = u.ID AND b.meta_key = 'b_date'
ORDER BY u.ID

We had to use coalesce since not all users have b_date data.

I would like to generate the same results with a php file to display the data on a webpage.

Here is the PHP code that I have tried. As is the code returns "0 results".

If I comment out the COALESCE, FROM, LEFT JOIN, and ORDER BY lines I get a list of my users with ID, Name, and Email Address.

<?php
$servername = "localhost";
$username = "adminuser";
$password = "mypass";
$dbname = "website";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
  die("Connection failed: " . $conn->connect_error);
}

$sql = '';
$sql .= "SELECT ID,display_name,user_email from users";
$sql .= "COALESCE(e.meta_value, '') AS user_email";
$sql .= "COALESCE(p.meta_value, '') AS phone";
$sql .= "COALESCE(b.meta_value, '') AS b_date";
$sql .= "FROM users u";
$sql .= "LEFT JOIN usermeta e ON e.user_id = u.ID AND e.meta_key = 'user_email'";
$sql .= "LEFT JOIN usermeta p ON p.user_id = u.ID AND p.meta_key = 'phone'";
$sql .= "LEFT JOIN usermeta b ON b.user_id = u.ID AND b.meta_key = 'b_date'";
$sql .= "ORDER BY u.ID";
$sql = '';

$result = $conn->query($sql);
    echo "ID &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Name &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Email Address &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Phone &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Birthdate". "<br>";
    
if ($result->num_rows > 0) {
  // output data of each row
  while($row = $result->fetch_assoc()) {
    echo $row["ID"]. "&nbsp;&nbsp;" . $row["display_name"]. "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" . $row["user_email"]. "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" . $row["phone"]. "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" . $row["b_date"] "<br>";
    
  }
} else {
  echo "0 results";
}
$conn->close();

?>

Thanks in advance, Kevin

KevinW
  • 3
  • 2
  • TL;DR: add `$sql = '';` and for every line in the query use `$sql .= " .... ";` – Alon Eitan Nov 08 '20 at 16:24
  • Alton, thank you for your help! I am not sure what TL:DR: means, and I don't know where to add $sql = '';. I added it above and below the query lines, just in case. I changed the query lines according to your example. I receive "0 results" when I run the code. Probably because I need to put TL:DR: someplace or put the $sql = ''; in the wrong place. – KevinW Nov 08 '20 at 23:37

0 Answers0