【问题标题】:How to use a string from mysqli_result in an insert query?如何在插入查询中使用来自 mysqli_result 的字符串?
【发布时间】:2017-05-02 15:30:46
【问题描述】:

我已经搜索并尝试了大约 3 个小时的不同解决方案,现在我正在寻找并发布这个问题。

我有以下代码;

<?php
include 'db.php';


$trackcd = $_GET['trackCD'];
$trackTitle = $_GET['trackTITLE'];
$duration = $_GET['secDuration'];

$artIDD = mysqli_query($conn, "SELECT artID FROM cd WHERE cdID=$trackcd");
$results = mysqli_query($conn, "SELECT artID, artName FROM artist WHERE artID=$artIDD");
$row = mysqli_fetch_assoc($results);

$sql = "INSERT INTO tracks (trackID, artID, artistName, trackCD, trackTITLE, secDuration) VALUES (?, ?, ?, ?, ?, ?)";
$stmt = $conn->prepare($sql);
$stmt->bind_param('iisssi', $trackID, $artIDD, $row["artName"], $trackcd, $trackTitle, $duration);
$result = $stmt->execute();
if(!$result) echo "Failed";
//header('Location: tracks.php');
?>

但是在第 10 行; $results = mysqli_query($conn, "SELECT artID, artName FROM artist WHERE artID=$artIDD");

我收到以下错误消息;

可捕获的致命错误:无法将类 mysqli_result 的对象转换为第 10 行 D:\xampp\htdocs\dashboard\inserttrack.php 中的字符串。

这些查询每个都使用一个主键,并且只返回一个结果,这是我稍后的 INSERT 查询所需要的。我看过的大多数以前的问题都建议创建一个循环,但我不知道这对我有什么帮助,因为我只得到一个我想稍后使用并且不需要打印出来的结果。

mysqli_query 和$row = mysqli_fetch_assoc($results); 的使用是我从类似问题中得到的,但它们并没有解决我的问题。

【问题讨论】:

  • 您的代码容易受到SQL injection 攻击。您应该使用mysqliPDO 准备好的语句和this post 中所述的绑定参数。
  • 你从哪里得到$artIDD
  • 感谢您的提醒。一旦我掌握了基础知识,我就会马上解决。
  • $artIDD = mysqli_query($conn, "SELECT artID FROM cd WHERE cdID=$trackcd");

标签: php mysqli


【解决方案1】:

您的第二次尝试向我们展示了正确的做法。只需绑定从fetch_assoc() 获得的变量即可。

此代码应如下所示:

$stmt = $conn->prepare('SELECT artID FROM cd WHERE cdID=?');
$stmt->bind_param('s', $trackcd);
$stmt->execute();
$results = $stmt->get_result();
$row = $results->fetch_assoc();
$artIDD = $row['artID'] ?? null;

$stmt = $conn->prepare('SELECT artID, artName FROM artist WHERE artID=?');
$stmt->bind_param('s', $artIDD);
$stmt->execute();
$results = $stmt->get_result();
$row = $results->fetch_assoc();

$sql = "INSERT INTO tracks (trackID, artID, artistName, trackCD, trackTITLE, secDuration) VALUES (?, ?, ?, ?, ?, ?)";
$stmt = $conn->prepare($sql);
$stmt->bind_param('iisssi', $trackID, $artIDD, $row["artName"], $trackcd, $trackTitle, $duration);
$result = $stmt->execute();

当然,如果您使用连接或子查询在一个查询中完成这一切会更好。

【讨论】:

    【解决方案2】:

    您没有将第一个查询的结果传递给您的第二个查询:

    $query = mysqli_query($conn, "SELECT artID FROM cd WHERE cdID=$trackcd");//vulnerable 
    $art_id_row = mysqli_fetch_assoc($query);
    $art_id = $art_id_row['artID']
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多