【问题标题】:Solving the return value of an SQL Query in an Associative Array解决关联数组中 SQL 查询的返回值
【发布时间】:2016-05-21 10:11:28
【问题描述】:

我再次受制于你的知识,希望你能提供帮助。

实际问题是粗斜体字,但是如果不阅读我提供的信息,您将无法提供帮助。

问题背景 - 我正在使用 HTML、CSS、MySQL 和 PHP 创建一个摄影网站(为我妈妈)。我正在处理数据库,特别是允许我妈妈使用此表单 (http://i.imgur.com/h4nXFFA.png) 将图像插入数据库。她不知道如何编码,因此我需要为她简化。

数据库背景(您需要知道的)-我有一个 image_tblalbum_tbl。 Album_tbl 显示在这里 - http://i.imgur.com/4GXh9MP.png - 每个专辑都有一个 ID 和名称(忘记“隐藏”)。 image_tbl 显示在这里 - http://i.imgur.com/RgC35Nd.png - 重要的部分(对于这个问题)是 albumName。

目标 - 我已经成功地使用来自 album_tbl 的专辑填充了“插入新图像”表单(图片显示“探索”)。我希望她能够单击专辑名称(这样她就知道要添加到哪个专辑),但我希望她插入的图像能够接收数据库中的专辑 ID。到目前为止,这是我的代码的 Pastebin

http://pastebin.com/6v8kvbGH = HTML 表单,帮助我了解代码中的第一个表单...

http://pastebin.com/4X6abTey = PHP/MySQL 代码。在这里,我们让我调用表单中的输入并在 2 个 SQL 查询中使用它们。第一个查询旨在获取输入的专辑名称的专辑ID,这就是出错的地方。注释掉的语句(使用 //)是我的错误检查,并且专辑名称是从表单传递的。 但是,从第一个 SQL 语句返回的行数是 0,而应该是 1。这是我需要帮助的地方,因为我的 assoc 数组显然有问题...强>

第二个目标 - 一旦第一个 SQL 查询开始工作,第二个 SQL 查询有望将所需的变量输入到 image_tbl 中,包括我希望从第一个 SQL 查询中获得的专辑 ID。

我希望这就是我所需要的,据我所知,理解这一点的人应该能够帮助我提供的东西。首先十分感谢!

杰克

有人让我粘贴代码 - HTML 表单:

    <h2>Insert a new image</h2><br>

    <form action="imagesInsert.php" method="POST" enctype="multipart/form-data">

        Name of Image: <input type="text" name="name" /><br>

        Date: <input type="text" name="dateTime" /><br>

        Caption: <input type="text" name="caption" /><br>

        Comment: <textarea type="text" name="comment" cols="40" rows="4"></textarea><br>

        Slideshow: <input type="text" name="slideshow" /><br>

        Choose an Album to place it in: 

            <?php
            mysql_connect('localhost', 'root', '');
            mysql_select_db('admin_db');

            $sql = "SELECT albumName FROM album_tbl WHERE hidden = false";
            $result = mysql_query($sql); ?>

            <select name='albumName'>; <?php
            while ($row = mysql_fetch_array($result)) {
                echo "<option value='" . $row['albumName'] . "'->" . $row['albumName'] . "</option>";
            }
            ?> </select>


        <input type="submit" name="submit"/><br>
    </form>



    <h2>Hide the Image</h2><br>

    <form action="imagesHidden.php" method="POST" enctype="multipart/form-data">

        Title: 

            <?php
            mysql_connect('localhost', 'root', '');
            mysql_select_db('admin_db');

            $sql = "SELECT name FROM image_tbl WHERE hidden = false";
            $result = mysql_query($sql);

            echo "<select name='name'>";
            while ($row = mysql_fetch_array($result)) {
                echo "<option value='" . $row['name'] . "'>" . $row['name'] . "</option>";
            }
            echo "</select>";
            ?>

            <input type="submit" value="Hide" name="submit">

    </form>



    <h2> Renew from Hidden Items </h2><br>

    <form action="imagesRestore.php" method="POST" enctype="multipart/form-data">

        Title: 

            <?php
            mysql_connect('localhost', 'root', '');
            mysql_select_db('admin_db');

            $sql = "SELECT name FROM image_tbl WHERE hidden = true";
            $result = mysql_query($sql);

            echo "<select name='name'>";
            while ($row = mysql_fetch_array($result)) {
                echo "<option value='" . $row['name'] . "'>" . $row['name'] . "</option>";
            }
            echo "</select>";
            ?>

            <input type="submit" value="Renew / Un-Hide" name="submit">

    </form>


</body>

使用 PHP/MySQL 插入图像:

    <?php

$username="root";
$password="";
$database="admin_db";
$servername="localhost";

// Create connection
$conn = new mysqli($servername, $username, $password, $database);

// Check connection
if ($conn->connect_error) 
{
    die("Connection failed: " . $conn->connect_error);
} 
echo "Connected successfully <br><hr>";

$name        = $_POST['name'];
$dateTime    = $_POST['dateTime'];
$caption     = $_POST['caption'];
$comment     = $_POST['comment'];
$slideshow   = $_POST['slideshow'];
$hidden      = false;
$albumName   = $_POST['albumName'];

// echo "album name is" . $albumName;

$sql = "SELECT albumID FROM album_tbl WHERE albumName = $albumName";
$albumID = $conn->query($sql);

// echo "Number of rows is " . $albumID->num_rows;

if ($albumID->num_rows > 0) {
    // output data of each row
    while($row = $albumID->fetch_assoc()) {
        echo "Album ID: " . $row["albumID"]. "<br>";
    }
} else {
    echo "0 results";
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

$new_comment = str_replace("'", "''", $comment);

$sql = "INSERT INTO `image_tbl`(`name`, `dateTime`, `caption`, `comment`, `slideshow`, `hidden`, `albumID`) VALUES ('$name', '$dateTime', '$caption', '$new_comment', '$slideshow', '$hidden', '$albumID')";

$result = $conn->query($sql);

if ($result)
{
    echo "Data has been inserted";
} 
else
{
    echo "Failed to insert";
}

$conn->close();
?>

【问题讨论】:

  • 请在此处发布您的相关代码,以便为未来的 SO 访问者保留。
  • 背景无关紧要。每个创建插入数据库的网站的人都是出于同样的原因——最终用户不直接使用数据库。
  • 完成,希望这就是您的意思。 - 杰克@JayBlanchard
  • stop using mysql_* functionsThese extensions 已在 PHP 7 中删除。了解 PDOMySQLiprepared 语句并考虑使用 PDO,it's really pretty easy
  • 哎呀,刚刚注意到他在第一个脚本中使用了mysql,只有第二个使用了mysqli。

标签: php html mysql database associative-array


【解决方案1】:

这一行:

$sql = "SELECT albumID FROM album_tbl WHERE albumName = $albumName";

应该是:

$sql = "SELECT albumID FROM album_tbl WHERE albumName = '$albumName'";

因为专辑名称是一个字符串。

您应该在执行查询时检查错误:

$albumID = $conn->query($sql) or die($conn->error);

您不能在 INSERT 查询中使用 $albumID。尽管有变量名称,但它不包含专辑 ID,它包含一个代表整个查询结果集的 mysqli_result 对象——您只能将它与 num_rowsfetch_assoc() 等方法一起使用来提取来自结果集的信息。

您可以做的是使用SELECT 语句作为UPDATE 中的数据源:

$stmt = $conn->prepare("INSERT INTO `image_tbl`(`name`, `dateTime`, `caption`, `comment`, `slideshow`, `hidden`, `albumID`) 
    SELECT ?, ?, ?, ?, ?, ?, albumID
    FROM album_tbl
    WHERE albumName = ?";
$stmt->bind_param("sssssss", $name, $dateTime, $caption, $comment, $slideshow, $hidden, $albumName);
$stmt->execute();

请注意,当您使用准备好的查询时,您不需要修复 $comment 中的引号(您应该使用 $conn-&gt;real_escape_string($comment),而不是 str_replace() 来完成)。

只是为了帮助您理解,这也可以在没有准备好的查询的情况下完成。

$sql = "INSERT INTO `image_tbl`(`name`, `dateTime`, `caption`, `comment`, `slideshow`, `hidden`, `albumID`) 
    SELECT '$name', '$dateTime', '$caption', '$new_comment', '$slideshow', '$hidden', albumID
    FROM album_tbl
    WHERE albumName = '$albumName'";

【讨论】:

  • 非常感谢,这么长时间的尝试解决它,这么简单的解决方案!问题仍然存在于第二个查询中,因为在 Assoc Array 完成并返回 ID 后它似乎死了。我研究了一个连接两个 SQL 查询的称为“联合”的东西,否则我不确定如何使用第二个查询来跟踪第一个查询
  • 您不能在INSERT 查询中使用$albumID。这是一个代表整个结果数据集的对象。实际专辑 ID 位于 $row['albumID']
  • 我已经更新了答案以显示如何插入。
  • 好的,$stmt 的最后一次更新让我大吃一惊。据我了解,我目前拥有的代码应该适用于您首先建议的更改。我现在从 assoc 数组接收到专辑 ID,但是我收到了关于您提出的建议的语法错误。我在 SQL Insert Query ( '$hidden', '$row(['albumID'])'"; ) 中将其更改为这个。它在 'albumID... '的开头创建了一个语法错误
  • 您需要阅读 PHP 文档中关于将变量替换为字符串的内容。 php.net/manual/en/language.types.string.php 特别注意复变量部分。
【解决方案2】:

首先创建一个单一的数据库连接让我们说

db_connection.php

<?php
    $username="root";
    $password="1k9i2n8gjd";
    $database="admin_db";
    $servername="localhost";

    // Create connection
    $conn = new mysqli($servername, $username, $password, $database);

    // Check connection
    if ($conn->connect_error){
        die("Connection failed: " . $conn->connect_error);
    }

    echo "Connected successfully <br><hr>";

然后在您的表单或任何需要数据库连接的 php 文件中,您只需包含db_connection.php,以便您拥有一个数据库连接。

注意:我已经将选项的值更改为albumId,这样您就不需要根据albumName查询或选择,因为您已经通过$_POST在imagesInsert.php中传递了al​​bumID

<?php 
   require_once('db_connection.php');
   //include_once('db_connection.php');
?>
<html>
<head>
    <title>Admin Page | Alison Ryde's Photography</title>
    <link rel="stylesheet" type="text/css" href="../../css/style.css">
</head>
    <body>

        <h2>Insert a new image</h2><br>

        <form action="imagesInsert.php" method="POST" enctype="multipart/form-data">

            Name of Image: <input type="text" name="name" /><br>

            Date: <input type="text" name="dateTime" /><br>

            Caption: <input type="text" name="caption" /><br>

            Comment: <textarea type="text" name="comment" cols="40" rows="4"></textarea><br>

            Slideshow: <input type="text" name="slideshow" /><br>

            Choose an Album to place it in:

                <?php

                $sql = "SELECT albumName FROM album_tbl WHERE hidden = false";
                $result = $conn->query($sql);// mysql_query($sql); ?>

                <select name='albumName'>; <?php
                while ($row = $result->fetch_array()) {
                    echo "<option value='" . $row['albumID'] . "'->" . $row['albumName'] . "</option>";
                }
                ?> </select>


            <input type="submit" name="submit"/><br>
        </form>



        <h2>Hide the Image</h2><br>

        <form action="imagesHidden.php" method="POST" enctype="multipart/form-data">

            Title:

                <?php


                $sql = "SELECT name FROM image_tbl WHERE hidden = false";
                $result = $conn->query($sql);//mysql_query($sql);

                echo "<select name='name'>";
                while ($row = $result->fetch_array()) {
                    echo "<option value='" . $row['name'] . "'>" . $row['name'] . "</option>";
                }
                echo "</select>";
                ?>

                <input type="submit" value="Hide" name="submit">

        </form>



        <h2> Renew from Hidden Items </h2><br>

        <form action="imagesRestore.php" method="POST" enctype="multipart/form-data">

            Title:

                <?php


                $sql = "SELECT name FROM image_tbl WHERE hidden = true";
                $result = $conn->query($sql);//mysql_query($sql);

                echo "<select name='name'>";
                while ($row = $result->fetch_array()) {
                    echo "<option value='" . $row['name'] . "'>" . $row['name'] . "</option>";
                }
                echo "</select>";
                ?>

                <input type="submit" value="Renew / Un-Hide" name="submit">

        </form>


    </body>
</html>

那么在你插入数据的php代码中应该是这样的。

imagesInsert.php

<?php 
       require_once('db_connection.php');
       //include_once('db_connection.php');

$name        = $_POST['name'];
$dateTime    = $_POST['dateTime'];
$caption     = $_POST['caption'];
$comment     = $_POST['comment'];
$slideshow   = $_POST['slideshow'];
$hidden      = false;
$albumID     = $_POST['albumName'];


$new_comment = str_replace("'", "''", $comment);

$sql = "INSERT INTO `image_tbl`(`name`, `dateTime`, `caption`, `comment`, `slideshow`, `hidden`, `albumID`) VALUES ('$name', '$dateTime', '$caption', '$new_comment', '$slideshow', '$hidden', '$albumID')";

$result = $conn->query($sql);

if ($result)
{
    echo "Data has been inserted";
}
else
{
    echo "Failed to insert";
}

$conn->close();
?>

另一个建议是使用准备好的语句,如果您的查询是由用户输入构建的,以避免 sql 注入

 <?php 
           require_once('db_connection.php');
           //include_once('db_connection.php');
    $name        = $_POST['name'];
    $dateTime    = $_POST['dateTime'];
    $caption     = $_POST['caption'];
    $comment     = $_POST['comment'];
    $slideshow   = $_POST['slideshow'];
    $hidden      = false;
    $albumID     = $_POST['albumName'];


    $new_comment = str_replace("'", "''", $comment);
 $sql = "INSERT INTO `image_tbl`(`name`, `dateTime`, `caption`, `comment`, `slideshow`, `hidden`, `albumID`) VALUES (?, ?, ?, ?, ?, ?, ?)";

$stmt = $conn->prepare($sql);
$stmt->bind_param("sssssss", $name, $dateTime, $caption,$new_comment,$slideshow,$hidden,$albumID);
$stmt->execute();

希望对你有帮助 :) 祝你好运

【讨论】:

  • 我使用了 Barmar 的回答,但我感谢您的帮助,并且一定会遵循您对 db_connection.php 的建议。 - 杰克
  • 我认为您不应该遵循容易发生 sql 注入的 sql。虽然它非常简单地解决了您的问题,但会破坏 :)
猜你喜欢
  • 1970-01-01
  • 2021-05-26
  • 2011-04-04
  • 2017-10-17
  • 1970-01-01
  • 1970-01-01
  • 2016-04-09
  • 1970-01-01
  • 2013-03-08
相关资源
最近更新 更多