Mysqli подготовил утверждение выборки изображения ошибка

Просто, ища и подбирая изображение из пути в mysqli, вот так:

<?php

$DBServer = 'localhost'; // e.g 'localhost' or '192.168.1.100'
$DBUser   = 'root';
$DBPass   = '';
$DBName   = 'water';
$conn = new mysqli($DBServer, $DBUser, $DBPass, $DBName);

// check connection
if ($conn->connect_error) {
trigger_error('Database connection failed: '  . $conn->connect_error, E_USER_ERROR);
}

$image = $GET['image'];

$sql = " SELECT kiti FROM `database` WHERE value LIKE '%$image%' ";

if(!$result = $conn->query($sql)){
die('There was an error running the query [' . $conn->error . ']');
}
$file_path = 'photos/';

while($row = $result->fetch_assoc()){
$src=$file_path.'/'.$row["key"];

echo '<img class="myimg" src="'.$src.'" alt="There ya go" width="100" height="100" />';
}

$conn->close();

?>

Но из-за страха за SQL-инъекцию создал его как подготовленное утверждение, но не получает изображения, пожалуйста, помогите:

<?php

$DBServer = 'localhost'; // e.g 'localhost' or '192.168.1.100'
$DBUser   = 'root';
$DBPass   = '';
$DBName   = 'water';
$conn = new mysqli($DBServer, $DBUser, $DBPass, $DBName);

// check connection
if ($conn->connect_error) {
trigger_error('Database connection failed: '  . $conn->connect_error, E_USER_ERROR);
}

$image = $GET['image'];

if ($stmt = $conn->prepare("SELECT kiti FROM `database` WHERE value=?")) {

// Bind a variable to the parameter as a string.
$stmt->bind_param("s", $image);

// Execute the statement.
$stmt->execute();
$stmt->bind_result($key);
// Fetch the data.
$stmt->fetch();

$result = $stmt->get_result();

$file_path = 'photos/';
if ($stmt->num_rows >= "1") {
while($row = $result->fetch_assoc()){
$src=$file_path.'/'.$row["key"];

echo '<img class="myimg" src="'.$src.'" alt="There ya go" width="100" height="100" />';
}
}else{

echo "0 records found";
}
// Close the prepared statement.
$stmt->close();
$conn->close();
}




}


?>

Я много пробовал, прочитал еще много постов, которые, кажется, не ошиблись, но не могли на это указать.

0

Решение

Вы должны добавить больше обработки ошибок. Каждый вызов метода может завершиться неудачно, и ваш сценарий должен отреагировать на эту ситуацию.
Например. нет другой ветки для

if ($stmt = $conn->prepare("SELECT key FROM `database` WHERE value=?")) {

так что, если подготовка не удастся, вы никогда не узнаете. Я предлагаю (по умолчанию) сначала выполнить ветку сбоя.

$stmt = $conn->prepare("SELECT key FROM `database` WHERE value=?")
if (!$stmt) {
someErrorHandlingHere();
}
else if ( !$stmt->bind_param("s", $image) ) {
someErrorHandlingHere();
}
else if ( !$stmt->execute() ) {
someErrorHandlingHere();
}
else if ( !$stmt->bind_result($key) ) {
someErrorHandlingHere();
}
else ...

Интересно, как ваш «оригинальный» код мог работать с key является зарезервированным словом / ключевым словом в mysql, см. https://dev.mysql.com/doc/refman/5.5/en/keywords.html

1

Другие решения

$stmt->fetch();

$result = $stmt->get_result();

Первая строка уже выбирает одну запись из набора результатов.
Если ваш запрос возвращает только одну запись, тогда в цикле while ничего не останется, чтобы извлечь -> ноль итераций.

0

По вопросам рекламы [email protected]