Несколько INSERT с использованием PDO со связыванием (PHP и amp; MySQL) [дубликат]

Альтернативный метод ответа BenAlabaster

Прежде всего, вы можете переписать запрос следующим образом:

var matches = from Users in people
        where Users.User_Rights == "Admin" ||
              Users.User_Rights == "Users" || 
              Users.User_Rights == "Limited"
        select Users;

Конечно, это более «многословно» и больно писать но он работает все равно.

Итак, если бы у нас был какой-то метод утилиты, который упростил создание таких выражений LINQ, мы бы были в бизнесе.

с помощью метода утилиты на месте вы можете написать что-то вроде этого:

var matches = ctx.People.Where(
        BuildOrExpression(
           p => p.User_Rights, names
        )
);

Это создает выражение, которое имеет такой же эффект, как:

var matches = from p in ctx.People
        where names.Contains(p.User_Rights)
        select p;

Но что более важно, фактически работает с .NET 3.5 SP1.

Вот функция сантехники, которая делает это возможным:

public static Expression> BuildOrExpression(
        Expression> valueSelector, 
        IEnumerable values
    )
{     
    if (null == valueSelector) 
        throw new ArgumentNullException("valueSelector");

    if (null == values)
        throw new ArgumentNullException("values");  

    ParameterExpression p = valueSelector.Parameters.Single();

    if (!values.Any())   
        return e => false;

    var equals = values.Select(value =>
        (Expression)Expression.Equal(
             valueSelector.Body,
             Expression.Constant(
                 value,
                 typeof(TValue)
             )
        )
    );
   var body = equals.Aggregate(
            (accumulate, equal) => Expression.Or(accumulate, equal)
    ); 

   return Expression.Lambda>(body, p);
}

Я не собираюсь пытаться объяснить этот метод, кроме как сказать, что он по существу строит предикат выражение для всех значений с помощью значенияSelector (т.е. p => p.User_Rights) и ORs, которые предикаты вместе создают выражение для полного предиката

Источник: http: //blogs.msdn. ком / б / AlexJ / архив / 2009/03/26 / наконечник-8-писание-где-в-стиле-запросов-using- LINQ к entities.aspx

6
задан Ibrahim Azhar Armar 4 June 2011 в 09:33
поделиться

2 ответа

Вы можете дать заполнителям любые имена, которые вы хотите, чтобы что-то вроде этого для вашего SQL:

INSERT INTO propAmenities 
(amenity_id, property_id) 
VALUES 
(:amenity_id1, :property_id1), 
(:amenity_id2, :property_id2), 
(:amenity_id3, :property_id3)

И затем:

$stmt->bindParam(':amenity_id1',  1);
$stmt->bindParam(':property_id1', 1);
$stmt->bindParam(':amenity_id2',  2);
$stmt->bindParam(':property_id2', 1);
$stmt->bindParam(':amenity_id3',  3);
$stmt->bindParam(':property_id3', 1);

Или, конечно, создать подходящий массив для execute. В этом случае нельзя использовать неименованные заполнители:

INSERT INTO propAmenities 
(amenity_id, property_id) 
VALUES 
(?, ?),
(?, ?),
(?, ?)

И затем вы можете прокручивать свои значения и вызывать execute с соответствующим массивом:

$stmt->execute(array(1, 1, 2, 1, 3, 1));
5
ответ дан mu is too short 19 August 2018 в 02:51
поделиться
  • 1
    вау, это было очень приятное объяснение, и, более того, я думаю, что лучше использовать неназванные заполнители, а затем именованные. – Ibrahim Azhar Armar 4 June 2011 в 09:53
  • 2
    @Ibrahim: Спасибо. Именованные и неназванные зависят от контекста. В этом конкретном случае неназванные заполнители, вероятно, проще, но если вы вставляете строки с более чем двумя столбцами, тогда имена заполнителей (с числовыми суффиксами, как указано выше), вероятно, будет легче понять с первого взгляда. В общем, я склоняюсь к названным заполнителям, поскольку они делают ваш код более понятным и менее подверженным ошибкам. OTOH, если вы создаете заполнители и значения, используя параллельные массивы (один для вопросительных знаков, один для значений), тогда неназванные заполнители могут быть проще. Таким образом, это зависит. – mu is too short 4 June 2011 в 10:02

Гораздо проще не использовать подготовленный запрос здесь, просто сгенерируйте строку запроса, используя некоторый файл implode () s и выполните его. Конечно, убедитесь, что ваши параметры правильно процитированы (так как они int, с применением intval () достаточно).

-6
ответ дан peufeu 19 August 2018 в 02:51
поделиться
  • 1
    -1, я не вижу причин, почему вы не можете достичь этого, используя подготовленный оператор? и поскольку я использую подход OO для своего проекта, настоятельно рекомендуется использовать PDO. – Ibrahim Azhar Armar 4 June 2011 в 09:55
  • 2
    -1, предполагая, что сложные запросы должны избегать стандартного механизма безопасности - это ящик Пандоры, который приводит к инъекциям SQL. Согласованность ценна. – Tom 4 June 2011 в 14:00
Другие вопросы по тегам:

Похожие вопросы: