2015-08-05 3 views
0

Simply, поиск и fecthing изображение с пути в MySQLi, как это работает corectly: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-инъекции страха, создал его как подготовленное заявление, но это не выборка изображения, Справка по PLS:

<?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(); 
} 




} 


?> 

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

ответ

1

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

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

+0

Я знаю, что ключ - это зарезервированное слово, но в orginial это kiti, я просто написал в быстром, без изменений, я его модифицировал. Но даже добавив, что обработчик ничего не изменил. –

0
$stmt->fetch(); 

$result = $stmt->get_result(); 

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

Смежные вопросы