PHP SQL-запрос Where In return null [duplicate]

Добавление случая, когда имя класса для объекта, используемого в структуре сущности, такое же, как имя класса для файла с кодировкой веб-формы.

Предположим, у вас есть веб-форма Contact.aspx, чей класс codebehind Свяжитесь с вами, и у вас есть имя объекта Contact.

Затем следующий код вызовет исключение NullReferenceException при вызове context.SaveChanges ()

Contact contact = new Contact { Name = "Abhinav"};
var context = new DataContext();
context.Contacts.Add(contact);
context.SaveChanges(); // NullReferenceException at this line

Ради полноты класса DataContext

public class DataContext : DbContext 
{
    public DbSet Contacts {get; set;}
}

и класс сущности контакта. Иногда классы сущностей являются частичными классами, так что вы можете распространять их и в других файлах.

public partial class Contact 
{
    public string Name {get; set;}
}

Ошибка возникает, когда оба класса entity и codebehind находятся в одном и том же пространстве имен. Чтобы исправить это, переименуйте класс сущности или класс codebehind для Contact.aspx.

Причина. Я все еще не уверен в причине. Но всякий раз, когда какой-либо из классов сущностей расширяет System.Web.UI.Page, возникает эта ошибка.

Для обсуждения рассмотрим NullReferenceException в DbContext.saveChanges ()

3
задан ATLChris 19 May 2011 в 03:48
поделиться

2 ответа

Это сценарий, когда делать это таким образом не подходит. Вы строите фактический SQL (это то, что запятые и кавычки), и передавая его в качестве параметра. Это в основном оценка value3 IN ('...'), где ... является полнотой $values.

Также это хороший вызов о кавычках. MySQL использует одинарные кавычки.

Вам нужно либо построить SQL, используя только конкатенацию строк, либо использовать несколько параметров.

EDIT

Как Пример:

$values = array('a','b','c','d');
$values = "'" . implode("','", $values) . "'";
$stmt->prepare('SELECT value1, value2 FROM table1 WHERE value3 IN (' . $values . ')');
1
ответ дан Chris Eberle 23 August 2018 в 23:17
поделиться

Прошел через некоторую информацию (см. также: https://stackoverflow.com/a/13253440/165330 ).

Он может , но НЕ ДОЛЖЕН быть выполнен.

Способ сделать это, будет использовать динамические переменные для предоставления переменных с автоопределением и с помощью call_user_func_array для подачи динамического количества аргументов обратного вызова / метода $ stmt-> bind_param () .

<?php
$values = array('a','b','c','d');

$s = substr( str_repeat( ' , ?' , count( $values ) ) , 2 );
$stmt->prepare('SELECT value1, value2 FROM table1 WHERE value3 IN (' . $s . ')');
# OR array_map in case of different datatypes
$typeDefintions = str_repeat( 's' , count( $values ) );
$params = array( $typeDefinitions );
foreach ( $values as $k => $v ) {
    ${ 'varvar' . $k } = $v;
    $params[] = &${ 'varvar' . $k };# provide references
}
call_user_func_array( array( $stmt , 'bind_param' ) , $params );
2
ответ дан Community 23 August 2018 в 23:17
поделиться
Другие вопросы по тегам:

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