Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/239.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 输出联接表_Php_Mysql_Database_Left Join - Fatal编程技术网

Php 输出联接表

Php 输出联接表,php,mysql,database,left-join,Php,Mysql,Database,Left Join,我目前正试图输出一个联接表 两个连接的表由客户表组成: 以及地址表: 然而,我得到了这个错误: 注意:未定义索引:Street 对于地址表中的每个连接索引,都会发生此错误(因此邮政编码城市和国家也会发生此错误) 我的问题是如何解决这个问题?为什么未定义是因为未使用联接行执行 $stmt = $pdo->prepare('SELECT * FROM Customer LEFT JOIN Address USING (AddressID)'); $stmt->execute();

我目前正试图输出一个联接表

两个连接的表由
客户
表组成:

以及
地址
表:

然而,我得到了这个错误:

注意:未定义索引:Street

对于
地址
表中的每个连接索引,都会发生此错误(因此
邮政编码
城市和
国家也会发生此错误)


我的问题是如何解决这个问题?

为什么未定义是因为未使用联接行执行

$stmt = $pdo->prepare('SELECT * FROM Customer LEFT JOIN Address USING (AddressID)');
$stmt->execute();
上面的代码就是获取联接代码的代码,然后立即用一个没有联接数据的新代码覆盖$stmt

删除这两行代码

$stmt = $pdo -> prepare('SELECT * FROM Customer');
$stmt -> execute();
它会起作用的

作为补充说明,在CustomerRowOut方法中,您使代码更难阅读

在双引号内使用变量replace system时,可以使用数组。用大括号把它们包起来就行了

因此,您当前的语法
$cn…
应该是
{$customerRow['CustomerName']}…
像这样包装数组的花括号将允许输出它。这也节省了内存,因为您不需要创建指针来简化回显

PHP还支持字符串类型变量中的换行符。这样整个功能就可以

function CustomerRowOutput($customerRow){
    return "<tr>
        <td>{$customerRow['CustomerName']}</td>
        <td>{$customerRow['PhoneNo']}</td>
        <td>{$customerRow['Email']}</td>
        <td>{$customerRow['Street']}</td>
        <td>{$customerRow['Postcode']}</td>
        <td>{$customerRow['City']}</td>
        <td>{$customerRow['Country']}</td>
    </tr>";
}
函数customerrowutput($customerRow){
返回“
{$customerRow['CustomerName']}
{$customerRow['PhoneNo']}
{$customerRow['Email']}
{$customerRow['Street']}
{$customerRow['Postcode']}
{$customerRow['City']}
{$customerRow['Country']}
";
}

为什么未定义是因为未使用联接行执行

$stmt = $pdo->prepare('SELECT * FROM Customer LEFT JOIN Address USING (AddressID)');
$stmt->execute();
上面的代码就是获取联接代码的代码,然后立即用一个没有联接数据的新代码覆盖$stmt

删除这两行代码

$stmt = $pdo -> prepare('SELECT * FROM Customer');
$stmt -> execute();
它会起作用的

作为补充说明,在CustomerRowOut方法中,您使代码更难阅读

在双引号内使用变量replace system时,可以使用数组。用大括号把它们包起来就行了

因此,您当前的语法
$cn…
应该是
{$customerRow['CustomerName']}…
像这样包装数组的花括号将允许输出它。这也节省了内存,因为您不需要创建指针来简化回显

PHP还支持字符串类型变量中的换行符。这样整个功能就可以

function CustomerRowOutput($customerRow){
    return "<tr>
        <td>{$customerRow['CustomerName']}</td>
        <td>{$customerRow['PhoneNo']}</td>
        <td>{$customerRow['Email']}</td>
        <td>{$customerRow['Street']}</td>
        <td>{$customerRow['Postcode']}</td>
        <td>{$customerRow['City']}</td>
        <td>{$customerRow['Country']}</td>
    </tr>";
}
函数customerrowutput($customerRow){
返回“
{$customerRow['CustomerName']}
{$customerRow['PhoneNo']}
{$customerRow['Email']}
{$customerRow['Street']}
{$customerRow['Postcode']}
{$customerRow['City']}
{$customerRow['Country']}
";
}

你完全正确,谢谢你的快速回答!我还对您的输出添加了一些改进,使其更具可读性。非常好。如果出于某种原因,OP希望避免换行符,那么只需添加多一点语法,使代码的格式如本答案所示,每行一个,但将一系列不带换行符的字符串(点运算符)串联在一起,例如
。“{$custRow['City']}”
。我们还可以注意到,从数据库返回的值不能保证不包含HTML。考虑到“狡猾<代码>街道<代码>值>代码> FooHee的影响。或者更邪恶的东西。最佳做法是将潜在的不安全值包装在
htmlentities
函数中。我认为@spencer7593的意思是
。"" . htmlentities($customerRow['Street'])。“”
我假设我们在输入之前对值进行转义/实体编码:D@MartinBarker:另一个绝对好的观点。我认为这些条目在数据库中不是html编码的,因为在我们的商店中它们不是html编码的(按设计),这是因为数据库条目也被其他进程使用,并以其他方式输出,而不是在html页面上发出它们。(我们将html编码保留到最后一层,就在表示层,就在html页面中包含条目的地方。)此模式也有助于代码验证,我们不必回溯整个系统来验证html编码是否已完成(而不是稍后撤消)。您完全正确,感谢您的快速回答!我还对您的输出添加了一些改进,使其更具可读性。非常好。如果出于某种原因,OP希望避免换行符,那么只需添加多一点语法,使代码的格式如本答案所示,每行一个,但将一系列不带换行符的字符串(点运算符)串联在一起,例如
。“{$custRow['City']}”
。我们还可以注意到,从数据库返回的值不能保证不包含HTML。考虑到“狡猾<代码>街道<代码>值>代码> FooHee的影响。或者更邪恶的东西。最佳做法是将潜在的不安全值包装在
htmlentities
函数中。我认为@spencer7593的意思是
。"" . htmlentities($customerRow['Street'])。“”
我假设我们在输入之前对值进行转义/实体编码:D@MartinBarker:另一个绝对好的观点。我认为这些条目在数据库中不是html编码的,因为在我们的商店中它们不是html编码的(按设计),这是因为数据库条目也被其他进程使用,并以其他方式输出,而不是在html页面上发出它们。(我们将html编码保留到最后一层,就在表示层,就在html页面中包含条目的地方。)此模式也有助于代码验证,我们不必回溯整个系统来验证html编码是否已完成(以后不会撤消)