【问题标题】:Selecting MySql table data into an array using PDO class?使用 PDO 类将 MySql 表数据选择到数组中?
【发布时间】:2014-04-09 21:51:18
【问题描述】:

我在这里找到了一些信息,但可以发表评论以询问更多信息。所以我的问题是: 我想从 mySQL 中选择我的数据。 我有两张桌子: 客户 (id,name,ak,numeris) prekes (id, customer_id, prek_name, prek_value)

两个表中的id都是自动递增的。

我尝试填充数组?

我只传递了一个值(customers.id)。有 5 条记录具有相同的 prekes.customer_id。

$pdo = Database::connect();
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = 'SELECT * FROM prekes WHERE customer_id=' . $pirkejas . ''; //$pirkejas = id passed via $_POST.
$q = $pdo->prepare($sql);
foreach ($pdo->query($sql) as $row) {
    //      if ($row['prek_pav'] != '') {
    $prekes = array($row['prek_name'], $row['prek_value']);

    Database::disconnect();

如何正确填充数组 $prekes?

编辑:

我想在我的表单中打印值:

<table class="table-bordered">
<tr>
<td><input class="input-medium" name="prekes[1][pavadinimas]" type="text"  placeholder="Prekė" value=""></td>
<td><input class="input-medium" name="prekes[1][kaina]" type="text"  placeholder="Kaina" value=""></td>
</tr>
<tr>
<td><input class="input-medium" name="prekes[2][pavadinimas]" type="text"  placeholder="Prekė" value=""></td>
<td><input class="input-medium" name="prekes[2][kaina]" type="text"  placeholder="Kaina" value=""></td>
</tr>
<tr>
<td><input class="input-medium" name="prekes[3][pavadinimas]" type="text"  placeholder="Prekė" value=""></td>
<td><input class="input-medium" name="prekes[3][kaina]" type="text"  placeholder="Kaina" value=""></td>
</tr>
<tr>
<td><input class="input-medium" name="prekes[4][pavadinimas]" type="text"  placeholder="Prekė" value=""></td>

我的行动是:

$pdo = Database::connect();
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $sql = "INSERT INTO customers (name,pavarde,ak,data, numeris) values(?, ?, ?, ?,?)";
    $q = $pdo->prepare($sql);
    $q->execute(array($name, $pavarde, $ak, date("Y-m-d H:i:s", time()), $numeris));

    $pirkejo_id = $pdo->lastInsertId();

    foreach ($prekes as $preke) {
        //prekiu uzpildymas
        $sql = "INSERT INTO prekes (customer_id,prek_name,prek_value) values(?, ?, ?)";
        $q = $pdo->prepare($sql);
        $q->execute(array($pirkejo_id, $preke['pavadinimas'], $preke['kaina']));
    }

    Database::disconnect();
    header("Location: default.php");

我不知道如何从数据库中获取所有值,

【问题讨论】:

  • 取决于您认为“正确的方法”。您希望数组看起来像什么?
  • 我更新了我的问题。我正在制作这个数组来设置输入表单中的值以编辑它们并再次放入数据库。

标签: php mysql sql arrays pdo


【解决方案1】:

不要在 SQL 查询中注入值。请改用参数绑定。

$q = $pdo->prepare('SELECT id, prek_name, prek_value FROM prekes WHERE customer_id = ?');
$q->execute([$pirkejas]); // if PHP < 5.4, use array($pirkejas)
$prekes = $q->fetchAll(PDO::FETCH_ASSOC);

现在$prekes 将是一个行数组,其中每一行都是一个关联数组。

<?php foreach ($prekes as $row) : ?>
<tr>
    <td>
        <input name="prekes[<?= (int) $row['id'] ?>][pavadinimas]"
               value="<?= htmlspecialchars($row['prek_name']) ?>">
    </td>
    <td>
        <input name="prekes[<?= (int) $row['id'] ?>][kaina]"
               value="<?= htmlspecialchars($row['prek_value']) ?>">
    </td>
</tr>
<?php endforeach ?>

【讨论】:

  • 他的语录是怎么搞砸的?他有一个不必要的`。 ''` 最后,但他们没有伤害任何东西。
  • @Barmar 删除了该注释。我看到两个单引号,我认为 SQL 转义 :)
【解决方案2】:

PDO 有一种方法可以为您执行此操作。此外,您不应将变量直接替换到查询中,而应使用参数。

$q = $pdo->prepare('SELECT * FROM prekes WHERE customer_id= :id');
$q->execute(array(':id' => $pirkejas));
$prekes = $q->fetchAll();

【讨论】:

  • 已修复——PDO 和 mysqli 之间很容易混淆。
  • 我认为他的意思是您没有检查执行的返回值,以查看查询是否失败。 if( $q && $q->execute() ) $prekes = $q->fetchAll();
  • 该问题设置了ERRMODE_EXCEPTION,所以我认为没有必要对其进行测试。
  • 一般情况下不是这样,但 ERRMODE_EXCEPTION 只会引发错误。有时失败的查询不是错误,或者至少这是我的经验。即执行返回 false,但 errorInfo() 不返回错误代码(看起来成功)。
  • 我认为您可能会将不返回任何行的查询与出现错误的查询混淆。
猜你喜欢
  • 2012-06-23
  • 1970-01-01
  • 2011-06-11
  • 2017-07-02
  • 2012-12-15
  • 2013-11-17
  • 2014-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多