происходит с кодом, подобным xyz->method()
, где xyz
не является объектом и, следовательно, method
не может
Это фатальная ошибка, которая остановит сценарий (уведомление о прямой совместимости: это станет захватывающей ошибкой, начиная с PHP 7).
Чаще всего это знак что в коде отсутствуют проверки условий ошибок. Убедитесь, что объект фактически является объектом перед вызовом его методов.
Пример типичного будет
// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);
В приведенном выше примере запрос не может и prepare()
назначит false
на $statement
. Попытка вызвать метод execute()
приведет к Fatal Error, потому что false
является «не объектом», потому что значение является логическим.
Выясните , почему ваша функция вернула логическое значение вместо объекта. Например, проверьте объект $pdo
для последней произошедшей ошибки. Подробности о том, как отлаживать это, будут зависеть от того, как обрабатываются ошибки для конкретной рассматриваемой функции / объекта / класса.
Если даже сбой ->prepare
не выполняется, то ваш дескриптор
// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);
базы данных
// ... some code using PDO
$statement = $pdo->prepare('invalid query', ...);
$statement->execute(...);
не попал в текущий объем . Найдите, где он определился. Затем передайте его как параметр, сохраните его как свойство или поделите его через глобальную область.
Другой проблемой может быть условное создание объекта, а затем попытка вызова метода вне этого условного блока. Например,
if ($someCondition) {
$myObj = new MyObj();
}
// ...
$myObj->someMethod();
Пытаясь выполнить метод вне условного блока, ваш объект не может быть определен.
Вопросы, относящиеся:
Если Вы собираетесь быть выполнением какой-либо синхронизации между базами данных с иногда связанными приложениями, то необходимо использовать GUID для первичных ключей. Это - своего рода боль для отладки, таким образом, кроме того случая я склонен придерживаться ints тот автоинкремент.
Автоинкремент ints должен быть Вашим значением по умолчанию, и не , использование их должно быть выровнено по ширине.
Это - сложный предмет, поняли ли Вы его или нет. Мог бы подпасть под раздел по этому StackOverflow FAQ.
, Какие вопросы разве я не должен задавать здесь?
Стараются не задавать вопросы, которые субъективны, спорны, или требуют расширенного обсуждения. Это - место для вопросов, на которые можно ответить!
Это было обсуждено в течение многих лет и продолжит обсуждаться в течение многих лет. Единственные подсказки согласия, которое я видел, состоят в том, что ответы несколько предсказуемы в зависимости от того, если Вы спрашиваете парня OO (GUID являются единственным способом пойти!), средство моделирования данных (Естественные ключи являются единственным способом пойти!), или производительность ориентировал DBA (INTs являются единственным способом пойти!).
Guids.period.
, Если необходимо масштабировать горизонтально или необходимо присвоить первичный ключ альтернативными средствами, они будут другом. Можно добавить индексы для всего остального.
<час>обновление для разъяснения моего оператора.
я работал над большим количеством различных видов сайтов. С маленького единственного сервера имеет дело к большим, поддержанным несколькими DB и веб-серверы. Конечно, были приложения, которые были бы очень хорошо с автоматическим постепенным увеличением ints как первичные ключи. Однако те не соответствуют модели того, как я делаю вещи.
При использовании GUID можно генерировать идентификатор где угодно. Это могло быть сгенерировано удаленным сервером, Вашим веб-приложением, в самой базе данных или даже в нескольких базах данных в мультиосновной ситуации.
, С другой стороны, автоматический увеличенный INT может только быть безопасно сгенерирован в основной базе данных. Снова, это могло бы быть хорошо, если у Вас есть приложение, которое будет глубоко связано с тем одним сервером БД поддержки, и масштабирование горизонтально не что-то, в чем Вы обеспокоены.
Несомненно, использование GUID означает, что у Вас должны быть ночью процессы переиндексации. Однако при использовании чего-нибудь кроме автоматического увеличенного INT, необходимо сделать это так или иначе. Heck, даже с INT как основное устройство, вероятно, что у Вас есть другие индексы, для которых нужно повторно созданный для контакта с фрагментацией. Поэтому использование GUID точно не добавляет другую проблему, потому что те задачи должны быть выполнены независимо.
, Если Вы смотрите на объемные приложения там, Вы заметите что-то важное: они все используют закодированные GUID Base64 в качестве ключей. Причина этого проста, использование GUID позволяет Вам масштабироваться легко, тогда как может быть много обручей для перехода через при попытке масштабировать горизонтально INTs.
Наше последнее приложение проходит период тяжелых вставок, который длится приблизительно в течение месяца. После этого 90 + % запросов - все, выбирает для создания отчетов. Для увеличения способности, я могу поднять дополнительные серверы БД во время этого большой период вставки; и позже легко объедините тех в единственный DB для создания отчетов. При попытке сделать это с INTs было бы абсолютным кошмаром.
Вполне откровенно говоря, любое время Вы кластеризируете базу данных или устанавливаете репликацию, сервер БД собирается потребовать, чтобы у Вас были GUID на таблице так или иначе. Так, если Вы думаете, что Ваша система, возможно, должна была бы вырасти, тогда выбирают тот, который это хорошо.
Мне нравятся естественные ключи, каждый раз, когда я могу доверять им. Я готов заплатить маленькую цену цены производительности для использования ключей, которые имеют смысл экспертам в предметной области.
таблицы For, которые описывают объекты, должны быть простым естественным ключом, который определяет отдельные экземпляры тем же путем, люди темы делают. Если тема не будет иметь защищенных идентификаторов для одного из объектов, то я обращусь к суррогатному ключу.
таблицы For, которые описывают отношения, я использую первичный ключ, где каждый ссылки компонента объект, который участвует в отношениях, и поэтому строке в таблице объекта. Снова, хит производительности для использования первичного ключа вообще минимален.
, Поскольку другие указали, термин "первичный ключ" немного вводит в заблуждение. В Реляционной модели данных термин, это используется, является "ключами-кандидатами". Могло быть несколько ключей-кандидатов для единственной таблицы. Логически, каждый так же хорош как другой. Выбор одного из них как "основные" и делание всех ссылок через тот ключ являются просто выбором, который может сделать разработчик.
О, еще одна причина, я использую GUID - я использую иерархическую структуру данных. Таким образом, у меня есть таблица 'Company' и таблица 'Vendor', для которой совпадают Первичные ключи. Но у меня также есть таблица 'Manufacturer', которая также 'наследовалась' Компании. Поля, которые характерны для Поставщиков и Производителей, не появляются в тех таблицах - они появляются в Компании. В этой установке, с помощью интервала является намного более болезненным, чем Гуиды. В очень наименьшем, Вы не можете использовать первичные ключи идентификационных данных.
Незначительно релевантный, но одна вещь я начал делать недавно, когда у меня есть маленькие таблицы классификации (по существу те, которые представили бы ПЕРЕЧИСЛЕНИЯ в коде), то, что я сделаю первичный ключ символом (3) или символом (4). Тогда я делаю те первичные ключи представителем справочного значения.
, Например, у меня есть система заключения в кавычки для наших внутренних Агентов по продажам. Мы "Стоили Категорий", из которых каждой позиции кавычки присваивают один из... Таким образом, у меня есть таблица поиска типа, названная 'tCostCategories', где первичный ключ является 'MTL', 'SVC', 'TRV', 'НАЛОГОМ', 'ODC'. Другие столбцы в таблице поиска хранят больше деталей, таких как нормальные английские значения кодов, "Материала", "Обслуживания", "Перемещения", "Налогов", "Другие Прямые затраты", и т.д.
Это действительно хорошо, потому что это не использует больше пространство, чем интервал, и когда Вы смотрите на исходные данные, Вы не должны связывать таблицу поиска для знания, какого черта значение. Например, строка кавычки могла бы быть похожей:
1 TRV
SVC
3 PartNumber2 MTL
2 OtherPartNumber PartNumber за 150$ за 29,99$ за 40$ намного легче, что использование интервала для представления категорий и затем соединения 1, 2, 3 на всех строках - у Вас есть данные тут же перед Вами, и производительность не кажется затронутой вообще (не, что я действительно протестировал.)
, Насколько реальный вопрос идет... Мне нравится RowGUID uniqueidentifiers. Я не 100% на этом, но не делаю все строки имеют внутренний RowGuid так или иначе?? Если так, затем использование RowGuid на самом деле заняло бы меньше места, чем ints (или что-либо еще в этом отношении.) Все, что я знаю, - то, что, если это достаточно хорошо за M$ для использования в GreatPlains тогда, это достаточно хорошо для меня. (Действительно ли я должен нырнуть??)
Почти всегда целые числа.
у Них есть другие серьезные основания помимо того, чтобы быть меньшим/быстрее для обработки. Который Вы записали бы - "404040" или "3463b5a2-a02b-4fd4-aa0f-1d3c0450026c"?
Путем я приближаюсь к первичным ключам (и я чувствую, является лучшим), должен постараться не иметь подход "по умолчанию". Это означает вместо того, чтобы просто хлопнуть на целом числе автопостепенного увеличения и прекращении дело, я смотрю на проблему и говорю, "там столбец или группа столбцов, которые всегда будут unqiue и не изменятся?" Если ответ - да тогда, я проявляю тот подход.
Мимо основного определительного ответа, что составляет хороший , первичный ключ оставляют в основном религии и аргументам повреждения помещения. Если у Вас будет что-то то есть, и будет всегда, отображаться исключительно на отдельную строку, то она будет хорошо работать как первичный ключ. Мимо той точки существуют другие соображения:
Этот последний вероятен, что привлекает большинство людей для использования вещей как GUID или самопостепенное увеличение целочисленных столбцов, потому что, полагаясь на вещи как адреса, номера телефона, первые / фамилии, и т.д., просто не сокращают его. Единственный инвариант о людях, о которых я могу думать, является SSNs, но тогда я даже не на 100% уверен в тех, которые остаются навсегда уникальным.
, Надо надеяться, это помогает добавить некоторую ясность...
Я имею, только используют автоинкрементный интервал или GUID. 99% времени у меня есть интервал автоинкремента использования. Это, что мне преподавали использовать, когда я сначала узнал о базах данных и никогда не сталкивался с причиной не использовать их (хотя я знаю о причинах, почему GUID был бы лучше).
мне нравится автоматический инкремент ints, потому что он помогает с удобочитаемостью. Например, я могу сказать, "смотрят на рекордные 129383", и для кого-то довольно легко войти и найти его. С GUID это почти невозможно сделать.
Я склонен использовать опцию № 1 или № 3 в зависимости от размера, числа людей, соединяющихся, и является ли это кратным ситуация с сервером базы данных или нет.
Опция № 2 не имеет большого количества смысла мне. Если кого-либо из этих трех недостаточно для идентификации уникальной записи, то это возможно (не проходя дополнительные махинации) два, имеют две записи, обнаруживаются с теми же значениями во всех трех столбцах. Если Вы хотите осуществить уникальность на какой-либо комбинации этих трех, то просто добавляют индекс для них.
Я всегда использовал суррогатный ключ - целое число автопостепенного увеличения, названное 'идентификатором'. Я вижу много причин сделать это, даже когда другая опция очевидна:
... и никакая разумная причина не к:
разумные причины против этого я не думал или столкнулся, все же всегда одобрены...
Столбцы автоприращения. Я в состоянии заставить свой код работать беспрепятственно с SQL Server или Oracle, идентификационные данные использования другие последовательности использования через мой DAL, и я не мог быть более счастливым. Я соглашаюсь, GUID иногда необходимы, если Вы делаете репликацию или отсылаете данные для получения его позже afer обработка.
Это - классик, "это зависит". Нет никакого правильного ответа для каждого проекта. Мне нравятся разные вещи за различные ситуации. Это зависит от того, использую ли я ORM и что это поддерживает. Это зависит от полной архитектуры (распределенный или нет, и т.д.). Просто выберите тот, что Вы думаете, будет работать и идти дальше к утверждению по вкладкам и пробелам.
должно быть по крайней мере 3 столбца, которые составляют первичный ключ.
я не понимаю это.
Вы говорите о "естественном ключе", например, "имени и дате рождения"? Естественный ключ мог бы быть идеальным, если он существует, но большинство кандидатов на естественный ключ является любой не уникальным (несколько человек с тем же именем) или не постоянным (кто-то может изменить их имя).
Международный / BigInt, какой автоинкремент является достаточно хорошими первичными ключами.
я предпочитаю Гуид. Потенциальная проблема с автоинкрементом состоит в том, что значение (например, "ID заказа") присвоено экземпляром базы данных (например, "базой данных о продажах")..., который не будет полностью работать (вместо этого, Вы начинаете нуждаться в первичных ключах), если когда-нибудь необходимо объединять данные, созданные больше чем одним экземпляром базы данных (например, из нескольких офисов продаж каждый с их собственной базой данных).
Я не вижу ответ, который указывает (что я рассматриваю как), действительно ключевой момент - а именно, что первичный ключ - то, что гарантирует, что Вы не получите две записи в таблице для того же реального объекта (как смоделировано в базе данных). Это наблюдение помогает установить то, что хорошо и что является плохим выбором для первичного ключа.
, Например, в таблице (американских) имен состояния и кодов, или имя или код могли быть первичным ключом - они составляют два различных ключа-кандидата, и один из них (обычно короче - код) выбран в качестве первичного ключа. В теории функциональных зависимостей (и зависимости от соединения - 1 нФ через 5 нФ - это - ключи-кандидаты, которые крайне важны, а не первичный ключ.
Для контрпримера, человеческие имена обычно делают плохой выбор для первичного ключа. Существуют многие люди, которые идут именем "John Smith" или некоторые другие аналогичные имена; даже принятие во внимание вторых имен (помните: не у всех есть один - например, я не делаю), существует много объема для дублирования. Следовательно, люди не используют имена в качестве первичных ключей. Они изобретают искусственные ключи, такие как Число Номера социального страхования (SSN) или Сотрудника и используют их для обозначения человека.
идеальный первичный ключ является коротким, уникальным, незабываемым, и естественным. Из этих характеристик уникальность обязательна; остальные должны согнуть, учитывая ограничения данных реального мира.
Когда дело доходит до определения первичного ключа данной таблицы, поэтому, необходимо посмотреть на то, что представляет та таблица. Что устанавливает, или наборы значений столбцов в таблице однозначно определяет каждую строку в таблице? Те - ключи-кандидаты. Теперь, если каждый ключ-кандидат состоит из 4 или 5 столбцов, то Вы могли бы решить, что те слишком неуклюжи для создания хорошего первичного ключа (прежде всего, на основании краткости). При тех обстоятельствах Вы могли бы представить суррогатный ключ - искусственно сгенерированное число. Очень часто (но не всегда) простое 32-разрядное целое число достаточно для суррогатного ключа. Вы тогда определяете этот суррогатный ключ как первичный ключ.
Однако Вы должны все еще удостоверяться, что другие ключи-кандидаты (для суррогатного ключа ключ-кандидат также, а также выбранный первичный ключ) все сохраняются как уникальный идентификатор - обычно путем размещения ограничения на уникальность данных на те наборы столбцов.
Иногда, люди находят трудным определить то, что делает строку уникальной, но должно быть что-то, чтобы сделать это, потому что просто повторение информации больше не делает его верным. И если Вы не осторожны и действительно добираетесь два (или больше) строки, подразумевающие хранить ту же информацию, и тогда необходимо обновить информацию, существует опасность (особенно при использовании курсоров), что Вы обновите всего одну строку, а не каждую строку, таким образом, строки будут вне синхронии, и никто не знает, какая строка содержит корректную информацию.
Это - довольно бескомпромиссное представление в некотором отношении.
у меня нет конкретной проблемы с использованием GUID, когда они необходимы, но они имеют тенденцию быть большие (как в 16-64 байтах), и они используются слишком часто. Очень часто совершенно хорошее 4-байтовое значение было бы достаточно. Используя GUID, где 4-байтовое значение удовлетворило бы дисковое пространство отходов и замедляет даже индексный доступ к данным с тех пор, существует меньше значений на индексную страницу, таким образом, индекс будет более глубоким, и больше страниц должно быть прочитано для получения до информации.
Это - только религиозная проблема, потому что люди ищут универсальный правильный ответ. То, что и Ваша команда и это ТАК распараллеливают шоу такое разногласие, должно быть подсказкой, что существуют серьезные основания использовать все решения, которые Вы описываете при различных обстоятельствах.
state
(CA, TX, Нью-Йорк), Вы могли бы также использовать char(2)
естественный ключ вместо интервала id
" суррогатный ключ излишне, когда совершенно хороший первичный ключ существует (это особенно верно в many-many таблицах). Мандат для трех столбцов вводит каждую таблицу, абсолютная ерунда. GUID РЕ
Предостерегается, если это будет действительно Действительно ДЕЙСТВИТЕЛЬНО ДЕЙСТВИТЕЛЬНО большая база данных, большая загрузка и быстрый доступ.
В моем последнем задании, где у нас были базы данных 100 - 500 миллионов записей, наши парни базы данных сильно привели доводы против GUID, и для соответственно размерного десятичного числа. Они чувствовали, что (под Oracle) различие в размере во внутренней памяти для строкового Гуида - по сравнению с - десятичное значение будет иметь очень заметное значение в поисках. (Большие ключи = более глубокие деревья для пересечения)
случайная природа GUID также уменьшает коэффициент заполнения для индексных страниц значительно - это существенно увеличивает дисковый ввод-вывод и разрыв.
Мне нравится блог Программиста баз данных как источник для этого вида информации
3 столбца для первичного ключа? Я сказал бы, что столбцы должны иметь соответствующие ограничения на уникальность данных, как бизнес-правила требуют, но у меня все еще был бы отдельный суррогатный ключ. Первичные ключи говорят серьезно, логика вводит в ключ. Если логика изменяется, Ваша целая схема завинчена.
Я всегда иду с суррогатным ключом. Суррогатный ключ (обычно столбец идентификационных данных, автоинкремент или GUID) является тем, в котором ключ не присутствует в самих данных. Естественный ключ, с другой стороны, является тем, который, самостоятельно, однозначно определяет строку. Почти я могу сказать в жизни, существуют едва любые реальны естественные ключи. Даже вещами как SSN в Соединенных Штатах не является естественный ключ. Составные первичные ключи являются неизбежным бедствием. Вы не можете отредактировать ни одни из тех данных (который является главным недостатком любого естественного ключа, составного объекта или не), но хуже то, что с составным ключом, теперь необходимо увековечить те ключевые данные в каждую связанную таблицу. Какие гигантские отходы.
Теперь, для выбора суррогатного ключа, я придерживаюсь столбцов идентификационных данных (я работаю главным образом в SQL Server MS). GUID является слишком большим, и Microsoft рекомендует против использование их как PK. Если у Вас есть несколько серверов, все, что необходимо сделать, делают инкремент 10 или 20 или независимо от того, что Вы думаете максимальное количество серверов, которые необходимо будет когда-либо синхронизировать/расширять к, и просто inc семя для каждой таблицы на каждом последующем сервере, и у Вас никогда не будет коллизии данных.
, Конечно, из-за инкремента, я делаю столбец идентификационных данных BigInt (иначе известный как длинное [64 бита]).
Выполнение небольшого количества математики даже при создании инкремента 100 Вы можете все еще иметь 92,233,720,368,547,758 (> 92 квадрильона) строки в Вашей таблице.
Немного вне темы, но я чувствую себя вынужденным согласиться с...
, Если Ваш первичный ключ является GUID, , не делают , делают его кластерный индекс . Так как GUID непоследовательны, данные будут перестроены на диске почти во время каждой вставки. (Фу). При использовании GUID в качестве первичных ключей они должны не кластеризироваться индексы.
Одна вещь, которую Вы никогда не должны делать, использовать умный ключ. Это - ключ, где информация о записи кодируется в самом ключе, и это в конечном счете укусит Вас.
я работал одно место, где первичный ключ был идентификатором учетной записи, который был комбинацией букв и чисел. Я не помню специфических особенностей, но, например, те учетные записи, которые имели определенный тип, будут в этих 600 диапазонах, и другого типа, запущенного с 400. Это было большим, пока тот клиент не решил попросить оба типа работы. Или измененный тип работы они сделали.
Другое место, используемое местоположение в дереве как первичный ключ для записей. Таким образом, были бы записи как следующее.
Cat1.subcatA.record1
Cat1.subcatA.record2
Cat1.subcatB.record1
Cat2.subcatA.record1
, Конечно, первой вещью, которую хотели клиенты, был способ переместить объекты в дерево вокруг. Весь набор программного обеспечения умер, прежде чем это произошло.
, если Вы пишете код, который я когда-либо должен поддерживать, не используйте умный ключ!
Я - поклонник автоинкремента как первичный ключ. Я знаю глубоко в моей основе, что это - отговорка, но она действительно делает настолько легким отсортировать данные по тому, когда она была добавлена (идентификатор ORDER BY DESC, f'r экземпляр).
3 столбца звучит ужасно резким для человеческого парсинга.
И это - компромисс - сколько из реляционной возможности делает Вам нужно, по сравнению с созданием ЭТОЙ ТАБЛИЦЫ, ПРЯМО ЗДЕСЬ понятной человеку, опрашивающему его (по сравнению с хранимой процедурой или программируемым интерфейсом).
автоинкремент является для нас людьми.:-(
Обычно это зависит.
Лично, мне нравится автоинкремент ints.
, Но, одна вещь я могу сказать Вам, никогда не должен доверять данным из других источников как Ваш ключ. Я клянусь, каждый раз, когда я сделал это, это возвращается, чтобы укусить меня. Ну, никогда снова!
Я думаю использование слова "Primary" во фразе, которую "Основной" Ключ находится в реальном смысле, вводя в заблуждение.
Первый, используйте определение, что "ключ" является атрибутом или набором атрибутов, которые должны быть уникальными в таблице,
Затем имение любого ключа служит нескольким часто взаимно непоследовательным целям.
Для увеличения perforamce запросов, которые должны быстро определить местоположение определенной записи/строки в таблице.
Для обеспечения непротиворечивости данных путем предотвращения дублирующихся строк, которые представляют тот же логический объект от того, чтобы быть вставленным itno таблица. (Это часто называют "естественным" ключом и должно состоять из таблицы (объект) атрибуты, которые являются относительно инвариантными.)
Очевидно, любой немногозначительный, ненатуральный ключ (как GUID или автоматически сгенерированное целое число полностью неспособно к удовлетворяющему № 4.
, Но часто, со многими (большинство) таблицы, полностью естественный ключ, который может обеспечить № 4, будет часто состоять из нескольких атрибутов и будет чрезмерно широк, или так будет широк, что с помощью него в целях № 1, № 2 или № 3 вызовет недопустимую производительность consequencecs.
ответ прост. Используйте обоих. Используйте простой ключ интеграла автоматической генерации для всех Соединений и FKs в других дочерних таблицах, но удостоверьтесь, чтобы каждая таблица, которая требует непротиворечивости данных (очень немного таблиц не делают) имела альтернативный естественный уникальный ключ, который предотвратит, вставляет непоследовательных строк данных... Плюс, если у Вас всегда есть оба, тогда все возражения против использования естественного ключа (что, если оно изменяется? Я должен изменить каждое место, на него ссылаются как FK), становятся спорными, поскольку Вы не используете его для этого... Вы только используете его в одной таблице, где это - PK, для предотвращения непоследовательных дублирующихся данных...
относительно GUID, быть очень тщательным использованием их, поскольку использование гуидов в индексе может полить из шланга индексную фрагментацию. Наиболее распространенные алгоритмы, используемые для создания их, помещают "случайную" часть гуида в старших значащих позициях двоичного разряда... Это увеличивает требование для регулярной индексной дефрагментации / Повторно индексирующий, поскольку добавляются новые строки.