php - PB / SQLite3 连接表
问题描述
我创建了 3 个表,我想要 3 个表的数据
T1
- idt1 - 主键
- n1t1
- n2t1
T2
- idt2 - 主键
- n1t2
- n2t2
T3
- idt3
- idt1 - 外键
- idt2 - 外键
- n1t3
- n2t3
- n3t3
- n4t3
我搜索这些信息:n1t1、n2t1、n1t2、n1t3、n2t3
代码 :
$stmt = $db->prepare("SELECT t1.n1t1 AS t1_n1t1, t1.n2t1 AS t1_n2t1, t2.n1t2 AS t2_n1t2, t3.n1t3 AS t3_n1t3, t3.n2t3 AS t3_n2t3
FROM t1
INNER JOIN t3 ON t1.idt1 = t3.idt1
INNER JOIN T2 ON T3.idt2 = T2.idt2
");
if ($result = $stmt->execute()) {
$arr = $result->fetchArray();
foreach ($arr as &$row) {
echo "1 : " . $row["t1_n1t1"] . "<br>";
echo "2 : " . $row["t1_n2t1"] . "<br>";
echo "3 : " . $row["t2_n1t2"] . "<br>";
echo "4 : " . $row["t3_n1t3"] . "<br>";
echo "5 : " . $row["t3_n2t3"] . "<br>";
}
}
错误:我有显示的值(1:2)它会有所不同,并且在某些名称上出现错误
Warning: Illegal string offset
,例如 n1T1 等。
我看到我在 t3 上的 idt1 和 idt2(外键)有一个列名:0
屏幕 :
我插入一个 example.csv :
n1t3;n2t3;n3t3;n4t3
123;n2a;n3a;n4a
456;n2b;n3b;n4b
789;n2c;n3c;n4c
456;n2d;n3d;n4d
代码:我将我的 FOREINGN KEY 添加到
if (($file = fopen('exemple.csv', 'r')) === FALSE)
echo "SQLite 3 : error CSV";
$req = $db->exec("CREATE TABLE t3 (idt3 integer PRIMARY KEY AUTOINCREMENT, idt1 integer, idt2 integer, n1t3, n2t3, n3t3, n4t3 FOREIGN KEY(idT1) REFERENCES t1(idt1), FOREIGN KEY(idt2) REFERENCES t2(idt2))");
$req = $db->prepare("INSERT INTO t3 (idt1, idt2, n1t3, n2t3, n3t3, n4t3) VALUES (:idt1, :idt2, :n1t3, :n2t3, :n3t3, :n4t3)");
$idt1 = 0;
$idt2 = 0;
$req->bindValue(':idt1', $idt1++, SQLITE3_INTEGER);
$req->bindValue(':idt2', $idt2++, SQLITE3_INTEGER);
...
我已经退休了第一行,在 t1 和 t3 命名表进行测试
fgetcsv($file);
但总是相同的错误代码......
新屏幕表:
解决方案
每当您将具有相同列名的表连接在一起时,您必须在列名前加上表名(或别名),最好只使用该语法作为默认语法,并始终在表名前加上列名(或别名)
<?php
$stmt = $db->prepare("SELECT T1.N1 AS T1_N1, T1.N2 AS T1_N2, T2.N1 AS T2_N1, T2.N2 AS T2_N2, T3.N1 AS T3_N1, T3.N2 AS T3_N2
FROM T1
INNER JOIN T3 ON T1.idT1 = T3.idT1
INNER JOIN T2 ON T3.idT2 = T2.idT2
");
if ($result = $stmt->execute()) {
$arr = $result->fetchArray();
foreach ($arr as &$row) {
echo "1 : " . $row["T1_N1"] . "<br>";
echo "2 : " . $row["T1_N2"] . "<br>";
echo "3 : " . $row["T2_N1"] . "<br>";
echo "4 : " . $row["T2_N2"] . "<br>";
echo "5 : " . $row["T3_N1"] . "<br>";
echo "6 : " . $row["T3_N2"] . "<br>";
}
}
推荐阅读
- yii2 - 如何使用 findall() 获取数据库的所有 NOT NULL 值
- php - PHP在所有行MYSQL的日期之间获取
- node.js - 从 Gitlab 私有存储库导入节点模块时出错
- r - 聚合函数后的计算
- doctrine-orm - 在 sqlanywhere 数据库的查询中,运算符“AND”不适用于 DQL 或查询生成器
- angular - 角度反应形式:hasError 函数返回 true 但不显示错误
- c++ - 自动生成 Makevars 和配置文件
- sql - 找到没有未来日期的最大日期的方法
- apache-samza - Hello-Samza 无法编译
- laravel - Laravel belongsTo 与演员不工作