PHP Warning: in_array() expects parameter 2 to be array

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • NECAnGeL
  • Registratie: Januari 2004
  • Laatst online: 16-09 07:29
Ik heb in wordpress iets gemaakt, maar nu zie ik in de error logs dat
PHP Warning: in_array() expects parameter 2 to be array, string given in
Alleen het punt is dat de een keer er wel een array is en de andere keer niet met die waarde, vandaar mijn dubbelle check.

Nu moet ik wel zeggen dat ik al een poosje niks meer heb gedaan en dacht van de week bouw dit eens, misschien kan het allemaal veel compacter.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// toegevoegd (producten verbergen met bepaalde roles)
$rb_user_id = get_current_user_id();
$rb_user_info = get_userdata( $rb_user_id );
$rb_user_roles = $rb_user_info->roles;
$rb_product_visibility_show = get_post_meta($Child_Product_ID, '_alg_wc_pvbur_visible', true);
$rb_product_visibility_hide = get_post_meta($Child_Product_ID, '_alg_wc_pvbur_invisible', true);


// R&B Kijken of de gebruiker is ingelogd  en/of ze een product mogen zien. Rol Guest of NDA is alleen voor ingelogde gebruikers
if ( !is_user_logged_in() && ($rb_product_visibility_hide == 'guest' || in_array('guest',$rb_product_visibility_hide) || $rb_product_visibility_show == 'met_rbweb_nda' || in_array('met_rbweb_nda',$rb_product_visibility_show)))
    { 
        $rb_product_visibility_check = 'hide';
        
    }
    else // Vanaf hier ingelogd
    { 
                
        // check of product niet mag worden weergeven aan een R&B gebruiker
        if ( $rb_product_visibility_show == 'met_rbweb_nda' || in_array('met_rbweb_nda',$rb_product_visibility_show) )
            {                       
                // Check of gebruiker de rechten heeft om product te zien.
                if ( $rb_user_roles == 'met_rbweb_nda' || in_array('met_rbweb_nda',$rb_user_roles) || $rb_user_roles == 'administrator' || in_array('administrator',$rb_user_roles))
                {           
                    $rb_product_visibility_check = '';
                    //echo 'test 2';
                }
                else
                {
                    $rb_product_visibility_check = 'hide';
                    //echo 'test 3';
                }
            }   
    }
    
    
// Einde R&B check product_visibility

[ Voor 0% gewijzigd door RobIII op 09-12-2020 21:27 . Reden: Syntax highlighting toegepast ]

https://www.rbwebpromotions.nl/

Beste antwoord (via NECAnGeL op 11-12-2020 11:37)


  • Mr. HTTP
  • Registratie: November 2020
  • Laatst online: 09-03-2022
Het blok met $rb_* in het begin heb ik buiten beschouwing gelaten, dat blijft hetzelfde.

Als eerste heb ik de code wat duidelijker uiteengezet voor de leesbaarheid.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// R&B Kijken of de gebruiker is ingelogd  en/of ze een product mogen zien. Rol Guest of NDA is alleen voor ingelogde gebruikers
if (
  !is_user_logged_in() &&
  (
    $rb_product_visibility_hide == 'guest' ||
    in_array('guest',$rb_product_visibility_hide) ||
    $rb_product_visibility_show == 'met_rbweb_nda' ||
    in_array('met_rbweb_nda',$rb_product_visibility_show)
  )
) {
  $rb_product_visibility_check = 'hide';
} else { // Vanaf hier ingelogd
  // check of product niet mag worden weergeven aan een R&B gebruiker
  if (
    $rb_product_visibility_show == 'met_rbweb_nda' ||
    in_array('met_rbweb_nda',$rb_product_visibility_show)
  ) {
    // Check of gebruiker de rechten heeft om product te zien.
    if (
      $rb_user_roles == 'met_rbweb_nda' ||
      in_array('met_rbweb_nda',$rb_user_roles) ||
      $rb_user_roles == 'administrator' ||
      in_array('administrator',$rb_user_roles)
    ) {
      $rb_product_visibility_check = '';
      //echo 'test 2';
    } else {
      $rb_product_visibility_check = 'hide';
      //echo 'test 3';
    }
  }
}
// Einde R&B check product_visibility


Door een helper-functie te maken en deze toe te passen in de if statements wordt het allemaal wat overzichtelijker.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/*
  Returns true if $role is found in $input, false otherwise
*/
function has_role($role,$input) {
  return (
    (is_string($input) && $input === $role) ||
    (is_array($input) && in_array($role,$input,TRUE))
  );
}

// R&B Kijken of de gebruiker is ingelogd  en/of ze een product mogen zien. Rol Guest of NDA is alleen voor ingelogde gebruikers
if (
  !is_user_logged_in() &&
  (
    has_role('guest',$rb_product_visibility_hide) ||
    has_role('met_rbweb_nda',$rb_product_visibility_show)
  )
) {
  $rb_product_visibility_check = 'hide';
} else { // Vanaf hier ingelogd
  // check of product niet mag worden weergeven aan een R&B gebruiker
  if (
    has_role('met_rbweb_nda',$rb_product_visibility_show)
  ) {
    // Check of gebruiker de rechten heeft om product te zien.
    if (
      has_role('met_rbweb_nda',$rb_user_roles) ||
      has_role('administrator',$rb_user_roles)
    ) {
      $rb_product_visibility_check = '';
      //echo 'test 2';
    } else {
      $rb_product_visibility_check = 'hide';
      //echo 'test 3';
    }
  }
}
// Einde R&B check product_visibility


Optimalisatie mogelijk? Als $rb_product_visibility_check uiteindelijk een lege string moet zijn ('') of de waarde 'hide' dan kun je het patroon gebruiken van de standaard/default waarde die je overschrijft als iets waar (TRUE) blijkt te zijn.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// default value (it's always this state unless proven otherwise)
$rb_product_visibility_check = 'hide';

// prove that the user is in the correct state
if (
  // user must be logged in
  is_user_logged_in() &&
  // AND $rb_product_visibility_show must have the role of 'met_rbweb_nda'
  has_role('met_rbweb_nda',$rb_product_visibility_show) &&
  // AND $rb_user_roles either has the role of 'met_rbweb_nda' or 'administrator'
  (has_role('met_rbweb_nda',$rb_user_roles) || has_role('administrator',$rb_user_roles))
) {
  $rb_product_visibility_check = '';
}


Waarbij het misschien ook logischer is (althans voor mij) om dit te doen:
PHP:
1
2
3
4
5
6
7
$rb_product_visibility = FALSE;

if (
  // ...
) {
  $rb_product_visibility = TRUE;
}

Alle reacties


Acties:
  • 0 Henk 'm!

  • FotW
  • Registratie: Juli 2012
  • Laatst online: 28-09 10:57
$rb_product_visibility_hide is een string omdat je als 3e parameter true meegeeft bij de get_post_meta dus die warning lijkt me logisch.

Je zegt zelf ook
$rb_product_visibility_hide == 'guest'
Dus waarom daarna ook nog controleren of guest in een array zit?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Het is mij niet helemaal helder wat je nu wil met dit topic anders dan "hier <plemp> wat code, wat vinden jullie?". Kun je wellicht een concrete vraag stellen?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • NECAnGeL
  • Registratie: Januari 2004
  • Laatst online: 16-09 07:29
FotW schreef op woensdag 9 december 2020 @ 20:26:
$rb_product_visibility_hide is een string omdat je als 3e parameter true meegeeft bij de get_post_meta dus die warning lijkt me logisch.

Je zegt zelf ook

[...]


Dus waarom daarna ook nog controleren of guest in een array zit?
Het punt is dat de plugin waaruit ik die waarde haal dit niet iedere keer in een array zet. Eigenlijk pas als er 2 roles zijn.

https://www.rbwebpromotions.nl/


  • NECAnGeL
  • Registratie: Januari 2004
  • Laatst online: 16-09 07:29
RobIII schreef op woensdag 9 december 2020 @ 21:28:
Het is mij niet helemaal helder wat je nu wil met dit topic anders dan "hier <plemp> wat code, wat vinden jullie?". Kun je wellicht een concrete vraag stellen?
ik wil die error weg hebben die er is.

https://www.rbwebpromotions.nl/


  • Foamy
  • Registratie: November 2006
  • Laatst online: 10:02

Foamy

Fulltime prutser

Je zegt zelf al:
Het punt is dat de plugin waaruit ik die waarde haal dit niet iedere keer in een array zet.
Als je dit dus niet zeker weet, dan moet je voordat je verder gaat controleren of je nu wel of niet met een array bezig bent.

blub


  • NECAnGeL
  • Registratie: Januari 2004
  • Laatst online: 16-09 07:29
Foamy schreef op donderdag 10 december 2020 @ 09:06:
Je zegt zelf al:

[...]

Als je dit dus niet zeker weet, dan moet je voordat je verder gaat controleren of je nu wel of niet met een array bezig bent.
En daarom ga ik ook aan dat ik al even een tijdje niks heb gedaan. Hier ga ik eens induiken. _/-\o_

https://www.rbwebpromotions.nl/


  • DJMaze
  • Registratie: Juni 2002
  • Niet online
NECAnGeL schreef op donderdag 10 december 2020 @ 08:43:
Het punt is dat de plugin waaruit ik die waarde haal dit niet iedere keer in een array zet. Eigenlijk pas als er 2 roles zijn.
Dan is het een inconsistente plugin en zou je hem niet moeten gebruiken.

Maak je niet druk, dat doet de compressor maar


  • NECAnGeL
  • Registratie: Januari 2004
  • Laatst online: 16-09 07:29
DJMaze schreef op donderdag 10 december 2020 @ 17:59:
[...]

Dan is het een inconsistente plugin en zou je hem niet moeten gebruiken.
daar zit wat in, maar ik ga dit oplossen.

https://www.rbwebpromotions.nl/


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Je schrijft het alsof die get_post_meta() in je eigen code zit? Fix dan gewoon die calls?

En casten naar array is anders ook geen rocket science.

Ook echt typische wp kwaliteit functie, zo’n boolean arg waarmee je gedrag zo verandert dat een return type hint niet mogelijk is, komt bij mij niet door de code review heen. ;)

[ Voor 36% gewijzigd door Voutloos op 10-12-2020 20:21 ]

{signature}


Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • Mr. HTTP
  • Registratie: November 2020
  • Laatst online: 09-03-2022
Het blok met $rb_* in het begin heb ik buiten beschouwing gelaten, dat blijft hetzelfde.

Als eerste heb ik de code wat duidelijker uiteengezet voor de leesbaarheid.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// R&B Kijken of de gebruiker is ingelogd  en/of ze een product mogen zien. Rol Guest of NDA is alleen voor ingelogde gebruikers
if (
  !is_user_logged_in() &&
  (
    $rb_product_visibility_hide == 'guest' ||
    in_array('guest',$rb_product_visibility_hide) ||
    $rb_product_visibility_show == 'met_rbweb_nda' ||
    in_array('met_rbweb_nda',$rb_product_visibility_show)
  )
) {
  $rb_product_visibility_check = 'hide';
} else { // Vanaf hier ingelogd
  // check of product niet mag worden weergeven aan een R&B gebruiker
  if (
    $rb_product_visibility_show == 'met_rbweb_nda' ||
    in_array('met_rbweb_nda',$rb_product_visibility_show)
  ) {
    // Check of gebruiker de rechten heeft om product te zien.
    if (
      $rb_user_roles == 'met_rbweb_nda' ||
      in_array('met_rbweb_nda',$rb_user_roles) ||
      $rb_user_roles == 'administrator' ||
      in_array('administrator',$rb_user_roles)
    ) {
      $rb_product_visibility_check = '';
      //echo 'test 2';
    } else {
      $rb_product_visibility_check = 'hide';
      //echo 'test 3';
    }
  }
}
// Einde R&B check product_visibility


Door een helper-functie te maken en deze toe te passen in de if statements wordt het allemaal wat overzichtelijker.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/*
  Returns true if $role is found in $input, false otherwise
*/
function has_role($role,$input) {
  return (
    (is_string($input) && $input === $role) ||
    (is_array($input) && in_array($role,$input,TRUE))
  );
}

// R&B Kijken of de gebruiker is ingelogd  en/of ze een product mogen zien. Rol Guest of NDA is alleen voor ingelogde gebruikers
if (
  !is_user_logged_in() &&
  (
    has_role('guest',$rb_product_visibility_hide) ||
    has_role('met_rbweb_nda',$rb_product_visibility_show)
  )
) {
  $rb_product_visibility_check = 'hide';
} else { // Vanaf hier ingelogd
  // check of product niet mag worden weergeven aan een R&B gebruiker
  if (
    has_role('met_rbweb_nda',$rb_product_visibility_show)
  ) {
    // Check of gebruiker de rechten heeft om product te zien.
    if (
      has_role('met_rbweb_nda',$rb_user_roles) ||
      has_role('administrator',$rb_user_roles)
    ) {
      $rb_product_visibility_check = '';
      //echo 'test 2';
    } else {
      $rb_product_visibility_check = 'hide';
      //echo 'test 3';
    }
  }
}
// Einde R&B check product_visibility


Optimalisatie mogelijk? Als $rb_product_visibility_check uiteindelijk een lege string moet zijn ('') of de waarde 'hide' dan kun je het patroon gebruiken van de standaard/default waarde die je overschrijft als iets waar (TRUE) blijkt te zijn.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// default value (it's always this state unless proven otherwise)
$rb_product_visibility_check = 'hide';

// prove that the user is in the correct state
if (
  // user must be logged in
  is_user_logged_in() &&
  // AND $rb_product_visibility_show must have the role of 'met_rbweb_nda'
  has_role('met_rbweb_nda',$rb_product_visibility_show) &&
  // AND $rb_user_roles either has the role of 'met_rbweb_nda' or 'administrator'
  (has_role('met_rbweb_nda',$rb_user_roles) || has_role('administrator',$rb_user_roles))
) {
  $rb_product_visibility_check = '';
}


Waarbij het misschien ook logischer is (althans voor mij) om dit te doen:
PHP:
1
2
3
4
5
6
7
$rb_product_visibility = FALSE;

if (
  // ...
) {
  $rb_product_visibility = TRUE;
}

Acties:
  • 0 Henk 'm!

  • NECAnGeL
  • Registratie: Januari 2004
  • Laatst online: 16-09 07:29
Ik heb het nu zo gedaan met de kennis die ik nu heb en het werkt en ik ook nog snap. Bovenstaande is me ook wel duidelijk, maar had dit al geschreven.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/* R&B toegevoegd (producten verbergen met bepaalde roles) */
$rb_user_id = get_current_user_id();
$rb_user_info = get_userdata($rb_user_id);
$rb_user_roles = $rb_user_info->roles;
$rb_product_visibility_show = get_post_meta($_product->get_id(), '_alg_wc_pvbur_visible', true);
$rb_product_visibility_hide = get_post_meta($_product->get_id(), '_alg_wc_pvbur_invisible', true);

// Eerst kijken of waardes in array staan, en anders in array zetten.
if(!is_array($rb_user_roles)) { $rb_user_roles = array($rb_user_roles); }
if(!is_array($rb_product_visibility_show)) { $rb_product_visibility_show = array($rb_product_visibility_show); }
if(!is_array($rb_product_visibility_hide)) { $rb_product_visibility_hide = array($rb_product_visibility_hide); }
    
// Kijken of de gebruiker is ingelogd  en/of ze een product mogen zien. Rol Guest of NDA is alleen voor ingelogde gebruikers
if ( !is_user_logged_in() )
    { 
        // Check of product is verborgen voor gasten
        if(in_array('guest',$rb_product_visibility_hide)) { 
            $rb_product_visibility_check = 'hide'; 
            $rb_product_visibility_melding = '<a href="https://******************************************.com/mijn-account/">Login om dit product te kunnen zien</a>';
            }
        
        // Niet ingelogd altijd verborgen voor niet (NDA) klanten  
        if (in_array('met_rbweb_nda',$rb_product_visibility_show)) { 
            $rb_product_visibility_check = 'hide'; 
            $rb_product_visibility_melding_nda = 'Dit product is alleen zichtbaar voor klanten met een geheimhoudingsverklaring (NDA). <a href="******************************************/view?usp=sharing" target="_blank">Klik hier</a> indien u deze nog niet heeft ondertekend en email deze aan <a href="mailto:info@******************************************.com">info@******************************************.com</a>';
            }
    }
    else // Ingelogd
        {   
            // kijken of het product alleen zichtbaar is voor klanten met een NDA
            if(in_array('met_rbweb_nda',$rb_product_visibility_show)) 
                { 
                    // als ze niet de rol NDA hebben dan product verbergen
                    if(!in_array('met_rbweb_nda',$rb_user_roles)) {
                        $rb_product_visibility_check = 'hide'; 
                        $rb_product_visibility_melding_nda = 'Dit product is alleen zichtbaar voor klanten met een geheimhoudingsverklaring (NDA). <a href="******************************************/view?usp=sharing" target="_blank">Klik hier</a> indien u deze nog niet heeft ondertekend en email deze aan <a href="mailto:info@******************************************.com">info@******************************************.com</a>';
                    }
                    
                    // Als het een administrator is, product altijd laten zien
                    if(in_array('administrator',$rb_user_roles)) {
                        $rb_product_visibility_check = ''; 
                    }
                }       
        } 
/* Einde R&B check product_visibility */


// R&B Open if aan de hand van bovenstaande product_visibility check
if ($rb_product_visibility_check == 'hide') {
    
    echo '<hr></br />'.$rb_product_visibility_melding. ' ' .$rb_product_visibility_melding_nda;
    
}else{

https://www.rbwebpromotions.nl/


Acties:
  • +1 Henk 'm!

  • Mr. HTTP
  • Registratie: November 2020
  • Laatst online: 09-03-2022
NECAnGeL schreef op vrijdag 11 december 2020 @ 11:42:
Ik heb het nu zo gedaan met de kennis die ik nu heb en het werkt en ik ook nog snap. Bovenstaande is me ook wel duidelijk, maar had dit al geschreven.
Het is een gezellig rommeltje ;)
Pagina: 1