No, hai creato un'istruzione preparata, quindi hai utilizzato la normale query che ha i segnaposto, ecco perché non funziona. Esegui l'istruzione preparata, quindi recupera il risultato da quella dichiarazione preparata.
$query = "SELECT * FROM photos WHERE cata=? OR catb=? OR catc=?";
$conn = $db->prepare($query);
$conn->bind_param("sss", $cata, $catb, $catc);
$conn->execute();
$conn->bind_result($cata, $catb, $catc);
?>
<table border="1">
<tr>
<th>cata</th>
<th>catb</th>
<th>catc</th>
</tr>
<?php
while ($conn->fetch()) {
echo '<tr>';
echo '<td>' . $cata . '</td>';
echo '<td>' . $catb . '</td>';
echo '<td>' . $catc . '</td>';
echo '</tr>';
}
O se hai il mysqlnd
(driver nativo mysql / o non avrai quella funzione indefinita), puoi anche usare get_result()
:
$query = "SELECT * FROM photos WHERE cata=? OR catb=? OR catc=?";
$conn = $db->prepare($query);
$conn->bind_param("sss", $cata, $catb, $catc);
$conn->execute();
$results = $conn->get_result(); // i like this better
?>
<table border="1">
<tr>
<th>cata</th>
<th>catb</th>
<th>catc</th>
</tr>
<?php
while ($row = $results->fetch_assoc()) {
echo '<tr>';
echo '<td>' . $row['cata'] . '</td>';
echo '<td>' . $row['catb'] . '</td>';
echo '<td>' . $row['catc'] . '</td>';
echo '</tr>';
}
?>