Вот мой оригинальный пост: Почему данные, которые я загружаю, переименовываются, и соответствующие данные добавляются в разные строки?
Мне удалось немного изменить код (используя решение, которое мне было дано), чтобы изображение, которое было отправлено на сервер через форму вставки, имеет то же имя, что и файл, который я загрузил.
Пример. Загрузите turtle.jpg в форму и нажмите «Вставить». Файл «turtle.jpg» будет записан в базу данных, где он находится на сервере (images / turtle.jpg). И тогда появится сообщение об успешном завершении.
Но каждый раз, когда я отправлял данные, изображение и другие данные вставлялись в базу данных по 2 строкам SEPERATE. Понятия не имею почему. Я также попытался изменить свой код, чтобы он использовал mysqli вместо mysql, и ничего не работает. Ошибок нет, но данные не отправляются в базу данных.
Вот мой новый php-код:
error_reporting(E_ALL); ini_set('display_errors', 1); // Create connection $conn = new mysqli('$host', '$user', '$pass', '$databasename'); // Check connection if (mysqli_connect_error()) { die("Database connection failed: " . mysqli_connect_error()); } if (!empty($_FILES["uploadedimage"]["name"])) { $file_name=$_FILES["uploadedimage"]["name"]; $temp_name=$_FILES["uploadedimage"]["tmp_name"]; $imgtype=$_FILES["uploadedimage"]["type"]; $ext= GetImageExtension($imgtype); $imagename= $_FILES['uploadedimage']['name']; $target_path = "images/".$imagename; $result = $mysqli->query("INSERT INTO charts ( charts_URL ) VALUES ('".$target_path."')"); or die(mysqli_error($mysqli)); } else { echo "<p> It is not working </p>"; } if(isset($_POST['submit'])){ // Fetching variables of the form which travels in URL $date = $_POST['date']; $retrace = $_POST['retrace']; $start_of_swing_trade = $_POST['start_of_swing_trade']; $end_of_swing_trade = $_POST['end_of_swing_trade']; $bull_flag = $_POST['bull_flag']; $bear_flag = $_POST['bear_flag']; $ema_crossover = $_POST['ema_crossover']; $trading_instrument = $_POST['trading_instrument']; if($date !=''||$trading_instrument !=''){ //Insert Query of SQL $sql = "INSERT into charts (charts_date, charts_retrace, charts_start_of_swing_trade, charts_end_of_swing_trade, charts_bullflag, charts_bearflag, charts_ema_crossover, charts_trading_instrument) VALUES ('$date', '$retrace', '$start_of_swing_trade', '$end_of_swing_trade', '$bull_flag', '$bear_flag', '$ema_crossover', '$trading_instrument')"; if (mysqli_query($conn, $sql)) { echo "New record created successfully"; } else { echo "Error: " . $sql . "<br>" . mysqli_error($conn); } } mysqli_close($conn); // Closing Connection with Server
Единственный раз, когда данные вставляются в базу данных, я использую старый код mysql_query. Но в моей базе данных говорится, что он поддерживает расширение mysqli.
Database server Server: Localhost via UNIX socket Server type: MySQL Server version: 5.5.35-cll-lve - MySQL Community Server (GPL) Protocol version: 10 User: cpses_msLpFymSYl@localhost Server charset: UTF-8 Unicode (utf8) Web Server cpsrvd 11.48.1.2 Database client version: libmysql - 5.1.73 PHP extension: mysqli Documentation phpmyadmin Version information: 4.0.10.7, latest stable version: 4.4.2
Вот фрагмент моего текущего PHP-кода (который в основном представляет собой код, который вы отправили в своем решении) с GetImageExtension
функцией GetImageExtension
:
if(isset($_POST['submit'])){ $conn = new mysqli($host, $user, $pass, $databasename); // Check connection can be established if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } function GetImageExtension($imagetype) { if(empty($imagetype)) return false; switch($imagetype) { case 'image/bmp': return '.bmp'; case 'image/gif': return '.gif'; case 'image/jpeg': return '.jpg'; case 'image/png': return '.png'; default: return false; } } $target_path = ''; if (!empty($_FILES["uploadedimage"]["name"])) { $file_name=$_FILES["uploadedimage"]["name"]; $temp_name=$_FILES["uploadedimage"]["tmp_name"]; $imgtype=$_FILES["uploadedimage"]["type"]; $ext= GetImageExtension($imgtype); $imagename= $_FILES['uploadedimage']['name']; $target_path = "images/".$imagename; $date = $_POST['date']; $retrace = $_POST['retrace']; $start_of_swing_trade = $_POST['start_of_swing_trade']; $end_of_swing_trade = $_POST['end_of_swing_trade']; $bull_flag = $_POST['bull_flag']; $bear_flag = $_POST['bear_flag']; $ema_crossover = $_POST['ema_crossover']; $trading_instrument = $_POST['trading_instrument'];
Вам может потребоваться проверить имена переменных и настроить их по своему вкусу. Используйте подготовленную инструкцию для предотвращения внедрения SQL.
if(isset($_POST['submit'])){ $conn = new mysqli($servername, $username, $password, $dbname); // Check connection can be established if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $target_path = ''; if (!empty($_FILES["uploadedimage"]["name"])) { $file_name=$_FILES["uploadedimage"]["name"]; $temp_name=$_FILES["uploadedimage"]["tmp_name"]; $imgtype=$_FILES["uploadedimage"]["type"]; $ext= GetImageExtension($imgtype); $imagename= $_FILES['uploadedimage']['name']; $target_path = "images/".$imagename; } $date = $_POST['date']; $retrace = $_POST['retrace']; $start_of_swing_trade = $_POST['start_of_swing_trade']; $end_of_swing_trade = $_POST['end_of_swing_trade']; $bull_flag = $_POST['bull_flag']; $bear_flag = $_POST['bear_flag']; $ema_crossover = $_POST['ema_crossover']; $trading_instrument = $_POST['trading_instrument']; if($date !=''||$trading_instrument !=''){ $sql = "INSERT into charts (charts_URL, charts_date, charts_retrace, charts_start_of_swing_trade, charts_end_of_swing_trade, charts_bullflag, charts_bearflag, charts_ema_crossover, charts_trading_instrument) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"; // s = string, i = integer, d = double, b = blob //preparing statement $stmt = $conn->prepare($sql); if(!$stmt){ exit("prepare failed");} //binding param $bind = $stmt->bind_param('sssssssss',$target_path, $date, $retrace, $start_of_swing_trade, $end_of_swing_trade, $bull_flag, $bear_flag, $ema_crossover, $trading_instrument); if(!$bind){ exit("bind failed");} //will return 0 if fail if($stmt->execute() != 0){ echo "New record created successfully"; }else{ echo "Failed to insert new record";} } //close connection $conn->close(); }
Но каждый раз, когда я отправлял данные, изображение и другие данные вставлялись в базу данных по 2 строкам SEPERATE. Понятия не имею почему.
Почему вы ожидаете, что он приземлится в том же ряду? Вы выполняете два разных запроса на вставку. Если вы хотите использовать два запроса, второй должен быть обновлением ранее вставленной строки. Но, очевидно, это не самый предпочтительный способ, просто используйте один запрос.
Объедините свой if (!empty($_FILES["uploadedimage"]["name"]))
и if(isset($_POST['submit']))
а затем используйте что-то вроде этого, где вы вставляете URL-адрес в тот же время в ту же строку, что и все другие значения:
INSERT into charts (charts_URL, charts_date, charts_retrace, charts_start_of_swing_trade, charts_end_of_swing_trade, charts_bullflag, charts_bearflag, charts_ema_crossover, charts_trading_instrument) VALUES (?,?,?,?,?,?,?,?)
Безопасность
Обратите внимание, что ваш код крайне небезопасен . $imagename
контролируется пользователем, поэтому ваш первый запрос открыт для SQL-инъекции. Значения во втором запросе явно контролируются пользователем, что тоже уязвимо. SQL-инъекция может выполняться во всех типах запросов, в том числе и в вставках. Это позволяет протекать данные, DOS и, возможно, выполнять код или изменять данные. Используйте подготовленные инструкции для защиты от SQL-инъекций . Он прост в использовании и приводит к хорошему коду, нет причин не использовать его.
Также обратите внимание, что $_FILES["uploadedimage"]["type"]
контролируется пользователем и не зависит от фактического типа файла или расширения. Вы не должны доверять ему при принятии решения о расширении изображения на своем сервере (если это так, злоумышленник может, например, загрузить скрипт PHP).