Как уже упоминалось, использование bindValue
вместо bindParam
, безусловно, достигнет этого. Однако, потратив значительное количество времени на устранение этой проблемы в последнее время, я нашел альтернативное решение. Вот как выполнить связывание переменных PDO в цикле foreach с помощью bindParam:
Заменить следующую строку из исходного сообщения:
$PDOStatement->bindParam( $field, $value );
... с этим:
$PDOStatement->bindParam( $field, $constraints[$field] );
Вместо привязки $value
используйте $array_name[$array_key]
. Это работает потому, что теперь вы привязываетесь к уникальной переменной, а не к той, которая используется повторно при каждом проходе цикла.
Переменная $field
, используемая в качестве заполнителя, очевидно, не обязательно должна быть уникальной переменной. Я еще не полностью исследовал это, но переменная, используемая в качестве заполнителя, кажется, анализируется немедленно (вместо того, чтобы назначаться в качестве ссылки на переменную), даже когда используется bindParam.
Кроме того, поскольку вам больше не нужен прямой доступ к $value
, вы также можете заменить это:
foreach( $constraints as $field => $value ) {
... с этим:
foreach (array_keys($constraints) as $field) {
Это необязательно, так как без этого изменения оно будет работать нормально. Хотя, на мой взгляд, он выглядит чище, так как позже он может запутаться, почему $value
назначается, но никогда не используется.