Выход из имен столбцов в операторах PDO

Вы неправильно используете символ /. Попробуйте это так:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:iws="http://vsystems.com/WS/StockAdjustments"
exclude-result-prefixes="iws">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:key name="k1" match="iws:StockAdjustment" use="concat(@Article, '|', @Status)"/>

<xsl:template match="/iws:StockAdjustments">
    <xsl:copy> 
        <xsl:for-each select="iws:StockAdjustment[generate-id()=generate-id(key('k1', concat(@Article,'|',@Status))[1])]">
            <xsl:copy>
                <xsl:copy-of select="@Article"/>
                <QTY_EXPE>
                    <xsl:value-of select="sum(key('k1', concat(@Article,'|',@Status))/@Quantity)" />
                </QTY_EXPE>
            </xsl:copy>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

Результат не тот, который вы опубликовали, но я пошел с вашей попыткой. В любом случае суммы верны.

25
задан ChrisR 29 September 2012 в 09:11
поделиться

2 ответа

Стандартным способом ANSI для создания идентификатора с разделителями является:

SELECT "field1" ...

и, если в имени есть «, удвойте его:

SELECT "some""thing" ...

К сожалению, это не работает в MySQL с настройками по умолчанию, потому что MySQL предпочитает думать, что двойные кавычки являются альтернативой одинарным кавычкам для строковых литералов. В этом случае вы должны использовать обратные кавычки (как обрисовано в общих чертах Бьёрном) и экранирование обратной косой черты.

Кому для правильного экранирования обратной косой черты вам понадобится mysql_real_escape_string, поскольку она зависит от набора символов. Но дело в споре, потому что ни mysql_real_escape_string, ни добавочные косые черты не экранируют символ обратной цитаты . Если вы можете убедитесь, что в именах столбцов никогда не будет символов, отличных от ASCII, которые вы можете получить, просто убрав обратную косую черту и символы `и \.

В любом случае, это несовместимо с другими базами данных. MySQL, чтобы разрешить синтаксис ANSI, установив параметр конфигурации ANSI_QUOTES. Аналогично, SQL Server также подавляется двойные кавычки по умолчанию; он использует еще один синтаксис, а именно квадратные скобки. Опять же, вы можете настроить его для поддержки синтаксиса ANSI с параметром «quoted_identifier».

Резюме: если вам нужна только совместимость с MySQL:

a. используйте обратные кавычки и запрещайте в именах символы обратных кавычек, обратной косой черты и nul, потому что экранирование их ненадежно

Если вам нужна совместимость с несколькими СУБД, либо:

b. используйте двойные кавычки и требуйте от пользователей MySQL / SQL-сервера соответствующего изменения конфигурации. Запрещать символы двойных кавычек в имени (так как Oracle не может их обработать даже без экранирования). Или

c. иметь настройку для MySQL против SQL Server против других, и в зависимости от этого вывести синтаксис обратной кавычки, квадратной скобки или двойной кавычки. Запретить как двойные кавычки, так и обратную косую черту / обратную цитату / нуль.

Это то, на что вы надеетесь, что уровень доступа к данным будет иметь функцию, но PDO нет.

Резюме резюме: произвольные имена столбцов - это проблема, которую лучше избегать, если вы можете ей помочь.

Краткое содержание резюме: gnnnnnnnnnnnh.

27
ответ дан bobince 28 November 2019 в 21:08
поделиться

Необычный дизайн проекта, но для вашей проблемы: окружите имена полей символом `и используйте дополнительные косые черты для имени.

select `field1`, `field2` from table where `field3`=:value
0
ответ дан 28 November 2019 в 21:08
поделиться
Другие вопросы по тегам:

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