Почему так работает, а так нет?
С PHP.NET:Связывает PHP переменную с именованным или неименованным параметром подготавливаемого SQL запроса. В отличие от PDOStatement::bindValue(), переменная привязывается по ссылке, и ее значение будет вычисляться во время вызова PDOStatement::execute().
Во втором случае в момент, когда происходит связывание переменная уже не существует. Попробуйте использовать bindValue.
код верен, если переменные и массивы корректны, какая ошибка?