【问题标题】:Selecting a MySQL row using a $_POST variable使用 $_POST 变量选择 MySQL 行
【发布时间】:2014-01-17 20:19:20
【问题描述】:

我在弄清楚如何从包含所需列值的行中打印实际值时遇到了一些问题。我有两个php文件,quantity.php和quantity-inquiry.php,其中quantity.php有一个post提交表单,通过quantity-inquiry.php重定向来执行实际的sql。

数量查询开通php:

//--------------------------------------------------------------------------
// 1) Connect to mysql database
//--------------------------------------------------------------------------
include 'db-connect-99k.php';
$db = new mysqli($host, $user, $pass, $databaseName);

if($db->connect_errno > 0){
  die('Unable to connect to database [' . $db->connect_error . ']');
}

//--------------------------------------------------------------------------
// 2) Query database for data
//--------------------------------------------------------------------------
$searchName = $_POST['name'];
$res = $db->query("SELECT * FROM inventory WHERE name=$searchName");

$searchName 是从 $_POST 中适当设置的(我可以将其回显并从数量表单字段中打印正确的输入):

<p> Product Name or PPI required (both not required) </p>
<p>--------------------------------------------------</p>
<form action="quantity_inquiry.php" method="post">
    Product Name: <input type="text" name="name"><br />
    PPI: <input type="text" name="ppi"><br />
<input type="submit" name="submit" id="submit">
</form>

换句话说,如果我在 quantity.php 的表单字段中键入“car”,quantity-inquiry.php 中的 $name 将回显“car”作为 $name 变量。我遇到的问题是使用 $name 作为我的查询:

$searchName = $_POST['name'];
$sql = "SELECT * FROM inventory WHERE name='".$searchName."'";
$res = $db->query($sql);

我似乎永远无法获得实际值。我尝试了很多东西,例如:

while($row = $res->fetch_assoc()){
    $rowName = $row['name'];
    $rowPPI = $row['ppi'];
    $rowQuantity = $row['quantity'];
    $rowPrice = $row['price'];
}   

设置变量后跟

<tr>
  <td> $rowName </td>
  <td> $rowPPI </td>
  <td> $rowQuantity </td>
  <td> $rowPrice </td}
</tr>

实际上并没有选择字段。例如,如果我知道我的库存表的“名称”列中有“product1”,并且它被设置为我的“$searchName”,它实际上并没有从表中选择它并将其打印为我的 $rowName, $rowPPI、$rowQuantity 和 $rowPrice。

我尝试了许多其他方法,但最终都会导致打印出某种错误或不正确的值。是我的查询错误还是我错误地设置/使用了我的变量?

【问题讨论】:

  • 至少,WHERE name=$name 应该是WHERE name="$name"(您需要更好的引用解决方案,但这可以帮助您入门)。然后您可能还想从结果中获取数据,例如while($obj = $res-&gt;fetch_object()){ echo $obj-&gt;name; }
  • @bishop 我已经编辑了我的代码。例如,我也尝试过 $rowName = $row->name...,但我总是在第 18 行得到错误。此外,我必须将变量名连接到字符串的末尾为了像你说的那样将它添加到字符串中。感谢您的意见

标签: php sql mysqli xhtml


【解决方案1】:

不是这个

$searchName = $_POST['name'];
$res = $db->query("SELECT * FROM inventory WHERE name=$searchName");

你应该这样做

$searchName = $_POST['name'];
$query = "SELECT * FROM inventory WHERE name = ?";
if($stmt = $mysqli->prepare($query)){
    $stmt->bind_param('s',$searchName);
    $stmt->execute();
    $result = $stmt->get_result();

    while($row = $result->fetch_assoc()){
        $rowName = $row['name'];
        $rowPPI = $row['ppi'];
        $rowQuantity = $row['quantity'];
        $rowPrice = $row['price'];
        ?>
        <tr>
            <td><?=$rowName?></td>
            <td><?=$rowPPI?></td>
            <td><?=$rowQuantity?></td>
            <td><?=$rowPrice?></td>
        </tr>

        <?php
    }

    $stmt->free_result();
    $stmt->close();
}else die("Failed to prepare!");

或者你可以超级喜欢这样做:

$query = "SELECT name, pip, quantity, price FROM inventory WHERE name = ?";

if($stmt = $mysqli->prepare($query)){
    $stmt->bind_param('s', $_POST['name']);
    $stmt->execute();
    $stmt->bind_result($rowName, $rowPPI, $rowQuantity, $rowPrice);


    while($stmt->fetch()){
        ?>
        <tr>
            <td><?=$rowName?></td>
            <td><?=$rowPPI?></td>
            <td><?=$rowQuantity?></td>
            <td><?=$rowPrice?></td>
        </tr>
        <?php
    }

    $stmt->free_result();
    $stmt->close();
}else die("Failed to prepare!");

【讨论】:

  • 比我的简单解决方案更好。我的工作,但这显然更深入。
  • @zgc7009 谢谢!请注意:我的解决方案可以保护您的数据库免受 SQL 注入...您发布的解决方案仍然为 SQL 注入留有空间。
【解决方案2】:

所以我只是看电脑太久了。一个愚蠢错误的简单解决方案。我离开了

$sql = "SELECT * FROM inventory WHERE name='".$searchName."'";

是的,当我更改以下内容时

$rowName -> $row['name'];

这是错误的。然后在尝试修复它时,我将 $sql 更改为

$sql = "SELECT * FROM inventory WHERE name=$searchName";

这是错误的,同时将我的变量集更改为

$rowName = $row['name'];

长话短说,如果他们被设置为

$sql = "SELECT * FROM inventory WHERE name='".$searchName."'";
$rowName = $row['name'];

注意 - 所有 $row* 变量都应设置为 = 而不是 ->

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 2020-04-07
    • 1970-01-01
    • 2015-03-02
    • 2016-12-23
    • 1970-01-01
    • 2014-05-22
    相关资源
    最近更新 更多