Make WordPress Core

Opened 16 months ago

Closed 16 months ago

Last modified 10 months ago

#63445 closed defect (bug) (wontfix)

Replace value casting with ! empty() check for positive value validation

Reported by: dilipbheda Owned by:
Priority: normal Milestone:
Component: Comments Version:
Severity: normal Keywords: has-patch changes-requested
Cc: Focuses: coding-standards

Description

The current logic for reading $_POST['position'] can be simplified. Instead of relying on value casting or a longer conditional expression, we can use ! empty() for a more concise and readable approach.

$position = ( isset( $_POST['position'] ) && (int) $_POST['position'] ) ? (int) $_POST['position'] : '-1';

TO:

$position = ! empty( $_POST['position'] ) ? (int) $_POST['position'] : -1;

Change History (13)

This ticket was mentioned in PR #8804 on WordPress/wordpress-develop by @dilipbheda.


16 months ago
#1

  • Keywords has-patch added

#2 @swissspidy
16 months ago

I would advise against introducing more usages of empty(), see for example https://localheinz.com/articles/2023/05/10/avoiding-empty-in-php/

#3 @dilipbheda
16 months ago

@swissspidy Should we use the following example instead of empty()?

( isset( $_POST['position'] ) && $_POST['position'] > 0 )

#4 @swissspidy
16 months ago

I think the current code is perfectly fine as-is

#5 @SirLouen
16 months ago

  • Keywords changes-requested added

@dilipbheda if I'm not wrong its even cleaner to use the null coalescing operator

Look how clean it can be:

$position = (int) ($_POST['position'] ?? '-1');

#6 @dilipbheda
16 months ago

@SirLouen It looks good to me — I’ll update it in my PR

#7 @dilipbheda
16 months ago

@SirLouen I checked your suggestion — it allows zero as well. If we want to allow only positive numbers, we should do it like this:
( isset( $_POST['position'] ) && $_POST['position'] > 0 )

Let me know your thoughts

#8 follow-up: @siliconforks
16 months ago

Note that these are not equivalent to the original code in handling invalid input.

The original code:

$position = ( isset( $_POST['position'] ) && (int) $_POST['position'] ) ? (int) $_POST['position'] : '-1';

The original code above guarantees that $position will never be zero.

$position = ! empty( $_POST['position'] ) ? (int) $_POST['position'] : -1;

The proposed code above will set $position to zero when $_POST['position'] contains a string like 'xyz'.

$position = ( isset( $_POST['position'] ) && $_POST['position'] > 0 ) ? (int) $_POST['position'] : -1;

That will also set $position to zero.

$position = (int) ($_POST['position'] ?? '-1');

Same here.

#9 @johnbillion
16 months ago

  • Milestone Awaiting Review
  • Resolutionwontfix
  • Status newclosed

This sort of trivial tweak in't a good use of anybody's time unless it fixes an actual bug. There's more info about this policy here: https://make.wordpress.org/core/handbook/contribute/code-refactoring/. Thanks for the contribution, but time is best spent on real bugs and enhancements.

#10 in reply to: ↑ 8 @SirLouen
16 months ago

Replying to siliconforks:

Note that these are not equivalent to the original code in handling invalid input.

True, I've tested and you are right in this regard
Don't ask me why but I was trusting that this was actually a PHPCS error (something like a usage of a non-sanitized variable or something like that) that needed to be addressed. But now I'm checking, and this is not a PHPCS trouble or whatsoever…

@dilipbheda, out of curiosity, what were you looking when you got to this idea to try to fix the code?

#11 follow-up: @dilipbheda
16 months ago

@dilipbheda, out of curiosity, what were you looking when you got to this idea to try to fix the code?

@SirLouen While reviewing the code, I noticed unnecessary casting in this condition, nothing else.

Here https://github.com/WordPress/wordpress-develop/blob/trunk/src/wp-admin/includes/ajax-actions.php#L1410

#12 in reply to: ↑ 11 @SirLouen
16 months ago

Replying to dilipbheda:

@dilipbheda, out of curiosity, what were you looking when you got to this idea to try to fix the code?

@SirLouen While reviewing the code, I noticed unnecessary casting in this condition, nothing else.

Here https://github.com/WordPress/wordpress-develop/blob/trunk/src/wp-admin/includes/ajax-actions.php#L1410

ngl, I'm amazed, why are you simply "reviewing" the code at random, instead of checking some reported bug or doing some tests?

It can feel paradoxical, but reviewing the code is a practice that is not recommended to be done.

Overall, these proactive tasks (like reviewing code, sorting future uncertain deprecations, etc…) are a bad idea because they don't provide use-cases and without a use-case it's very difficult to test.

To reach a conclusion, we have to rely single-handedly on the good knowledge (and very uncommon) of people like @siliconforks to consider many possible scenarios for such review without breaking the system

I'm going to publish soon an article in dev blog about this topic, I will send it to you in Slack when it’s live.

@SergeyBiryukov commented on PR #8804:


10 months ago
#13

Thanks for the PR! Closing for now, as the associated Trac ticket is closed.

Note: See TracTickets for help on using tickets.