为什么这个mysql insert语句不起作用?

时间:2014-07-08 03:42:57

标签: php mysql

我正在尝试将图像插入名为'img'的longblob类型字段中:

    include('config.php');

    $imgData =  mysqli_real_escape_string($conn, file_get_contents($_FILES['im_age']  ['tmp_name']));

    $qry="  insert into tblproducts(
    vendorid, prefix, overallsize, handlematerial, img, code, itemcost, shippingcost,
    profitpercentage, discountpercentage, caption, availability, quantity
    ) 
    values(
    $_POST[vendor_id],
    $_POST[pre_fix],
    $_POST[overall_size],
    $_POST[handle_material],
    $imgData,
    $_POST[co_de],
    $_POST[item_cost],
    $_POST[shipping_cost],
    $_POST[profit_percentage],
    $_POST[discount_percentage],
    $_POST[cap_tion],
    $_POST[avail_ability],
    $_POST[quan_tity]
    )
";

   $result = mysqli_query($conn, $qry) or die("Could not execute query!");

编辑:我收到以下错误:“无法执行查询”

如何进行图像插入?提前谢谢!

3 个答案:

答案 0 :(得分:2)

您的POST值未正确插值。您不应该使用插值或连接来构建查询。以下是编写prepared statement以防止SQL注入的方法:

$qry = "INSERT INTO tblproducts (
    vendorid, prefix, overallsize, handlematerial, img, code, itemcost, shippingcost,
    profitpercentage, discountpercentage, caption, availability, quantity
    ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);";

$stmt = mysqli_prepare($conn, $qry);

mysqli_stmt_bind_param($stmt, 'sssssssssssss', 
    $_POST['vendor_id'],
    $_POST['pre_fix'],
    $_POST['overall_size'],
    $_POST['handle_material'],
    $imgData,
    $_POST['co_de'],
    $_POST['item_cost'],
    $_POST['shipping_cost'],
    $_POST['profit_percentage'],
    $_POST['discount_percentage'],
    $_POST['cap_tion'],
    $_POST['avail_ability'],
    $_POST['quan_tity']
);

if (!mysqli_stmt_execute($stmt)) {
    echo 'Query failed.';
}

当然还有更高级的错误处理技术和使用面向对象的东西,但这应该涵盖了使查询正常工作的基础知识。

您可能已经注意到查询中的问号参数。 MySQLi不支持命名参数。如果您希望在查询中使用命名参数,例如:vendor_id,请尝试使用PDO

答案 1 :(得分:2)

关于您的查询:没有任何帖子数据会被解析到查询中,因为您只是编写它。您需要在{$var}中连接变量或包装变量。同样,$_POST中的键应该用单引号括起来。例如:$_POST['vendor_id'];

使用mysqli_prepare()mysqli_bind_param()进行更实用,更安全的查询。

关于MySQL中的图像,您可以但不建议这样做。查看this post了解有关它的更多信息。

答案 2 :(得分:1)

这是因为您正在将图像直接重新插入到查询文本中,这可能会导致一系列问题。

请改用mysqli_prepare and mysqli_stmt_bind_param。正如戴暗示,这更加安全。