gpt4 book ai didi

php - 为什么 foreach($array as $value) 会导致不确定的数据类型

转载 作者:行者123 更新时间:2023-11-29 12:26:54 30 4
gpt4 key购买 nike

我做了以下方法,这里没有什么特别的,但我得到了一个令人困惑的错误:

SQLSTATE[42P18]: Indeterminate datatype: 7 FEHLER: konnte Datentyp von Parameter $2 nicht ermitteln (SQL: select * from "roles" where ("name" = Admin) limit 1)

("could not determine type of parameter $2")

似乎我们不知道行中的 $value 是哪种数据类型

$role = Role::firstOrNew(array('name' => $value));

实际上是。

一旦我把它改成

$role = Role::firstOrNew(array('name' => '$value'));

一切都很好。事实上,我在上面几行中使用了几乎相同的过程,这让我想知道为什么 php 不知道返回的数据类型。

也许有人可以向我解释幕后的魔法:)

<?php
namespace App\Modules\AddressManagement\Seeds;

use Carbon\Carbon;
use Eloquent, Permission, DB, Voucher, Role, Log;

class DatabaseSeeder extends \Illuminate\Database\Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
Eloquent::unguard();
// Add Permissions
$permissions = [
'am_read_global_address' => ['Bundesweit Adressen lesen' => ['Admin', 'Vertriebsleiter']],
'am_write_global_address' => ['Bundesweit Adressen hinzufügen' => ['Admin', 'Vertriebsleiter']],
'am_read_region_address' => ['Regional Adressen lesen' => ['Regionalleiter']],
'am_write_region_address' => ['Regional Adressen schreiben' => ['Regionalleiter']],
'am_read_branches_address' => ['Branchnweit Adressen lesen' => ['Branchenmanager']],
'am_write_branches_address' => ['Branchenweit Adressen schreiben' => ['Branchenmanager']]
];


// Deploy permission to database
// Update if permission already exists
foreach ($permissions as $pname => $roles) {
$permission = Permission::firstOrNew(array('name' => $pname));
$permission->display_name = key($roles);
$permission->save();

foreach ($roles as $value) {
$role = Role::firstOrNew(array('name' => $value)); // Without enclosed ' we get indeterminate datatype, php PLS
$role->save();
$role->perms()->attach($permission->id);
}
}
}
}

编辑:就像下面的答案 $value 实际上是一个数组。这不是故意的。在我将它发布到这里之前,我的解决方案中有一个 array_pop 但由于某些原因我删除了它并得到了那个错误。没想到。完整的代码在这里(它可以工作,所以一切都很好!)。单引号使变量成为纯字符串这一事实对我来说是新的,所以你一定要这样做。

public function run()
{
Eloquent::unguard();
// Add Permissions
$permissions = [
'am_read_global_address' => ['Bundesweit Adressen lesen' => ['Admin', 'Vertriebsleiter']],
'am_write_global_address' => ['Bundesweit Adressen hinzufügen' => ['Admin', 'Vertriebsleiter']],
'am_read_region_address' => ['Regional Adressen lesen' => ['Regionalleiter']],
'am_write_region_address' => ['Regional Adressen schreiben' => ['Regionalleiter']],
'am_read_branches_address' => ['Branchnweit Adressen lesen' => ['Branchenmanager']],
'am_write_branches_address' => ['Branchenweit Adressen schreiben' => ['Branchenmanager']]
];


// Deploy permission to database
// Update if permission already exists
foreach ($permissions as $pname => $perm) {
$permission = Permission::firstOrNew(array('name' => $pname));
$permission->display_name = key($perm);
$permission->save();
$roles = array_pop($perm);

foreach ($roles as $value) {
$role = Role::firstOrCreate(array('name' => $value));
try {
$role->perms()->attach($permission->id);
} catch(\Exception $e) {
// Nothing but duplicate entry, ignore
}
}
}
}

最佳答案

似乎 Role::firstOrNew 期待一个结构不同的第一个参数并提示它无法处理你传递给它的任何东西(我可以在网上找到几个例子,但没有实际的 Laravel 文档来支持这一说法)。与您提供的参数中的 name 键关联的值很可能是一个字符串。当您这样做时:

'$value' 

您最终会得到一个字符串,因为 PHP 中的单引号字符串不会尝试转换变量。由于 key($roles) 的值在您的示例中始终是一个字符串,而 $value 是一个数组,我发现与 name 键应该是字符串而不是数组。也许是这样的?

 $role = Role::firstOrNew(array('name' => $value[0]));

关于php - 为什么 foreach($array as $value) 会导致不确定的数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30194113/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com