Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP MySQL JSON更新_Php_Mysql_Json - Fatal编程技术网

PHP MySQL JSON更新

PHP MySQL JSON更新,php,mysql,json,Php,Mysql,Json,我在更新MySQL5.7.xjson数据时遇到问题 我在field activities中存储了以下JSON。我想搜索结果为_id=418的活动 我的表2017_评估_数据有一条记录,其中包含student_id字段(值3531)和activities JSON字段,其中包含以下数据: { "course": "ENGLISH", "level" : "2", "activities": [ { "comments":

我在更新MySQL5.7.xjson数据时遇到问题

我在field activities中存储了以下JSON。我想搜索结果为_id=418的活动

我的表2017_评估_数据有一条记录,其中包含student_id字段(值3531)和activities JSON字段,其中包含以下数据:

  {
      "course": "ENGLISH",
      "level" : "2",
      "activities": [
        {
          "comments": "test1",
          "outcomes": [
            {
              "outcome_id": "423",
              "course": "ENGLISH",
              "course_level": "2",
              "internal_outcome_id": "1"
            }
          ],
          "activity_name": "Quiz from chapters 1,2",
          "date_completed": "20180201"
        },
        {
          "comments": "test1 comments",
          "outcomes": [
            {
              "outcome_id": "421",
              "course": "ENGLISH",
              "course_level": "2",
              "internal_outcome_id": "4"
            },
            {
              "outcome_id": "415",
              "course": "ENGLISH",
              "course_level": "2",
              "internal_outcome_id": "5"
            }
          ],
          "activity_name": "Test chapter 4",
          "date_completed": "20180201"
        },
        {
          "comments": "test1",
          "outcomes": [
            {
              "outcome_id": "426",
              "course": "ENGLISH",
              "course_level": "2",
              "internal_outcome_id": "4"
            },
            {
              "outcome_id": "418",
              "course": "ENGLISH",
              "course_level": "2",
              "internal_outcome_id": "3"
            }
          ],
          "activity_name": "Activity",
          "date_completed": "20180201"
        },
        {
          "comments": "",
          "outcomes": [],
          "activity_name": "NEW",
          "date_completed": ""
        }
      ]
    }
我在JSON数据的底部添加了一个空的活动,但以后无法编辑这些值

以下是我的PHP代码:

$update = "
    UPDATE 2017_assessment_data 

    SET

    assessment_data = JSON_SET(assessment_data,'$.activities.activity_name','NEW ACTIVITY NAME')



    WHERE 

    student_id = '3531' 
    AND 
    JSON_EXTRACT(assessment_data, '$.course') =  'ENGLISH' 
    AND 
    JSON_EXTRACT(assessment_data, '$.level') =  '2'
    AND
    JSON_EXTRACT(assessment_data, '$.activities[*].activity_name') =  'NEW'


    ";

有什么想法吗

这可以使用MySQL JSON函数来完成。您的查询略有不同:

UPDATE 2017_assessment_data
SET assessment_data = JSON_SET(assessment_data, TRIM('"' FROM JSON_SEARCH(assessment_data, 'one', 'NEW')), 'NEW ACTIVITY NAME')
WHERE student_id = '3531' AND 
      JSON_EXTRACT(assessment_data, '$.course') =  'ENGLISH' AND 
      JSON_EXTRACT(assessment_data, '$.level') =  '2' AND
      JSON_SEARCH(assessment_data, 'one', 'NEW') REGEXP '^"\\$\\.activities\\[[0-9]+\\]\\.activity_name"$'
区别在于:

  • WHERE
    子句中,我们使用
    JSON\u SEARCH
    并使用
    REGEXP
    检查是否存在
    'NEW'
    值,确保它与预期路径匹配
  • SET
    子句中,我们使用相同的
    JSON\u SEARCH
    获取要更新的值的路径。请注意,我们必须
    修剪该值的前导双引号和尾随双引号,因为它们在路径字符串中无效
  • 在PHP中生成此查询的最简单方法是使用语法,因为它最大限度地减少了其他必要的引用和转义。例如:

    $sid = 3531;
    $course = 'ENGLISH';
    $level = 2;
    $sql = <<<EOD
    UPDATE 2017_assessment_data
    SET assessment_data = JSON_SET(assessment_data, TRIM('"' FROM JSON_SEARCH(assessment_data, 'one', 'NEW')), 'NEW ACTIVITY NAME')
    WHERE student_id = '$sid' AND 
          JSON_EXTRACT(assessment_data, '$.course') =  '$course' AND 
          JSON_EXTRACT(assessment_data, '$.level') =  '$level' AND
          JSON_SEARCH(assessment_data, 'one', 'NEW') REGEXP '^"\\\\$\\\\.activities\\\\[[0-9]+\\\\]\\\\.activity_name"$'
    EOD;
    echo $sql;
    

    在MYSQL中很有魅力,但是如何让它在PHP中工作呢?双引号“正在引起问题。我试着用\和没有joyHi Paul来逃离它们,请参见我的编辑。我想这对你应该有用。太棒了!从未使用过herdoc,但将:)它现在在PHP中对我有效。很遗憾,我必须使用正则表达式来进行此查询。MYSQL JSON函数似乎不喜欢处理对象数组——更新或搜索。我可以只使用JSON的文本字段和正则表达式。嗨,保罗,我一直在使用正则表达式,如果你确定你不会在JSON的其他地方得到一个包含“NEW”的字段,那么你可以简单地将
    REGEXP…
    更改为
    不为NULL
    UPDATE 2017_assessment_data
    SET assessment_data = JSON_SET(assessment_data, TRIM('"' FROM JSON_SEARCH(assessment_data, 'one', 'NEW')), 'NEW ACTIVITY NAME')
    WHERE student_id = '3531' AND 
          JSON_EXTRACT(assessment_data, '$.course') =  'ENGLISH' AND 
          JSON_EXTRACT(assessment_data, '$.level') =  '2' AND
          JSON_SEARCH(assessment_data, 'one', 'NEW') REGEXP '^"\\$\\.activities\\[[0-9]+\\]\\.activity_name"$'