数据不被使用的MySQLi和PHP submited到SQL数据库(Data not being s

2019-10-22 17:26发布

这是我的原帖: 为什么我上传的数据已重命名,以及相应的数据添加到不同的行?

我可以编辑代码一点点(使用我给出的解决方案),因此这是通过插件的形式提交到服务器的图像有同样的名字,因为我上载的文件。

例如:我上传到turtle.jpg的形式,然后单击插入。 文件“turtle.jpg”将被写入所在的服务器(图像/ turtle.jpg)上的数据库。 然后一个成功的消息将弹出。

但每次我发送的数据,图像和其它数据将被插入到2个独立的行数据库。 我不知道为什么。 我也尝试修改我的代码,以便它使用的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功能补充说:

 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']; 

Answer 1:

您可能需要检查的变量名称并调整自己的喜好。 用事先准备好的声明,以防止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();
}


Answer 2:

但每次我发送的数据,图像和其它数据将被插入到2个独立的行数据库。 我不知道为什么。

为什么你会希望它在同一行中降落? 您可以执行两种不同的插入查询。 如果你想使用两个查询,第二个必须是先前插入行的更新。 但很明显,这不是首选方式,只需使用一个查询。

结合您if (!empty($_FILES["uploadedimage"]["name"]))if(isset($_POST['submit']))然后使用这样的事情,你在哪里一样插入网址时间到同一行的所有其他值:

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脚本), 你不应该相信它



文章来源: Data not being submited to SQL Database using MySQLi and PHP